وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

استفاده از سیگنال های جنگو برای ساده سازی و جداسازی کد

0 38
زمان لازم برای مطالعه: 13 دقیقه


معرفی

سیستم ها با گذشت زمان پیچیده تر می شوند و این نیاز به جداسازی بیشتر سیستم ها را تضمین می کند. ساخت، گسترش و نگهداری یک سیستم جدا شده در درازمدت آسان‌تر است، زیرا جداسازی نه تنها پیچیدگی سیستم را کاهش می‌دهد، بلکه هر بخش از سیستم را می‌توان به صورت جداگانه مدیریت کرد. تحمل خطا نیز افزایش یافته است زیرا در یک سیستم جدا شده، یک جزء معیوب کل سیستم را با خود به پایین نمی کشد.

جنگو یک چارچوب وب منبع باز قدرتمند است که می تواند برای ساختن سیستم های بزرگ و پیچیده و همچنین سیستم های کوچک استفاده شود. این الگوی معماری مدل-قالب-نما را دنبال می کند و به هدف خود برای کمک به توسعه دهندگان برای دستیابی به برنامه های کاربردی پیچیده مبتنی بر داده مبتنی بر وب صادق است.

جنگو ما را قادر می‌سازد تا با ساخت اپلیکیشن‌های جداگانه در یک پروژه، عملکرد سیستم را جدا کنیم. به عنوان مثال، ما می‌توانیم یک سیستم خرید داشته باشیم و برنامه‌های جداگانه‌ای داشته باشیم که حساب‌ها، ارسال ایمیل‌ها و اعلان‌ها را مدیریت می‌کنند.

در چنین سیستمی، ممکن است چندین برنامه برای انجام یک عمل در هنگام وقوع رویدادهای خاص مورد نیاز باشد. زمانی که مشتری سفارشی می دهد، یک رویداد ممکن است رخ دهد. به عنوان مثال، ما باید از طریق ایمیل به کاربر اطلاع دهیم و همچنین سفارش را برای تامین کننده یا فروشنده ارسال کنیم، در همان زمان می توانیم دریافت و process مبلغ پرداختی. همه این رویدادها به طور همزمان اتفاق می‌افتند و از آنجایی که برنامه ما جدا شده است، باید همه مؤلفه‌ها را هماهنگ نگه داریم، اما چگونه می‌توانیم به این هدف برسیم؟

سیگنال های جنگو در چنین شرایطی مفید است، تنها چیزی که باید اتفاق بیفتد این است که وقتی کاربر سفارشی را ارسال می کند، سیگنالی ارسال می شود و هر مؤلفه مرتبط یا آسیب دیده به آن گوش می دهد و عملیات خود را انجام می دهد. اجازه دهید در این پست بیشتر در مورد سیگنال ها بررسی کنیم.

سیگنال ها در یک نگاه

سیگنال های جنگو یک پیاده سازی از الگوی مشاهده گر. در چنین الگوی طراحی، مکانیزم اشتراکی اجرا می‌شود که در آن چندین شیء مشترک یا “مشاهده” یک شی خاص و هر رویدادی که ممکن است برای آن اتفاق بیفتد، اجرا می‌شود. یک تشبیه خوب این است که چگونه همه مشترکین یک کانال YouTube هنگام آپلود محتوای جدید توسط یک سازنده محتوا، اعلان دریافت می کنند.

جنگو از طریق یک “Dispatcher سیگنال” قادر است سیگنال ها را در یک راه اندازی جدا شده به “گیرنده” ثبت شده در اجزای مختلف سیستم توزیع کند. سیگنال‌ها هر زمان که رویدادهای خاصی رخ می‌دهند، ثبت و راه‌اندازی می‌شوند، و هر شنونده آن رویداد، در کنار دریافت برخی داده‌های متنی درون باری که ممکن است با عملکرد گیرنده مرتبط باشد، از وقوع رویداد مطلع می‌شوند. یک گیرنده می تواند هر تابع یا روش پایتون باشد. بیشتر روی این بعدا روی.

جنگو به غیر از ارسال کننده سیگنال، سیگنال های مفیدی را نیز ارائه می کند که می توانیم به آنها گوش دهیم روی. آنها عبارتند از:

  • post_save، که هر زمان که یک مدل جنگو جدید ایجاد و ذخیره شده باشد ارسال می شود. به عنوان مثال، هنگامی که یک کاربر ثبت نام می کند یا یک پست جدید را آپلود می کند،
  • pre_delete، که درست قبل از حذف یک مدل جنگو ارسال می شود. یک سناریوی خوب زمانی است که کاربر در حال حذف یک پیام یا حساب خود است،
  • request_finished، که هر زمان جنگو سرویس یک درخواست HTTP را تکمیل کند، فعال می شود. این می تواند از باز کردن وب سایت یا دسترسی به یک منبع خاص متغیر باشد.

یکی دیگر از مزایای جنگو این است که یک چارچوب بسیار قابل تنظیم است. در مورد ما، ما می توانیم سیگنال های سفارشی خود را ایجاد کنیم و از سیستم داخلی برای ارسال و دریافت آنها در سیستم جدا شده خود استفاده کنیم. در بخش دمو، ما مشترک برخی از سیگنال‌های داخلی جنگو می‌شویم و همچنین برخی از سیگنال‌های سفارشی خودمان را ایجاد می‌کنیم.

اما ابتدا، بیایید یک مثال سریع را ببینیم که از سیگنال های جنگو استفاده می کند. در اینجا دو عملکرد داریم که با یکدیگر پینگ پنگ بازی می کنند، اما از طریق سیگنال ها تعامل دارند:

from django.dispatch import Signal, receiver


ping_signal = Signal(providing_args=("context"))

class SignalDemo(object):
    
    def ping(self):
        print('PING')
        ping_signal.send(sender=self.__class__, PING=True)


@receiver(ping_signal)
def pong(**kwargs):
    if kwargs('PING'):
        print('PONG')

demo = SignalDemo()
demo.ping()

در این اسکریپت ساده ما یک کلاس با یک متد برای ارسال سیگنال و یک تابع جداگانه در خارج از کلاس ایجاد کرده ایم که دریافت و پاسخ می دهد. در مورد ما، فرستنده سیگنال را ارسال خواهد کرد PING فرمان همراه با سیگنال، و عملکرد گیرنده بررسی خواهد کرد که آیا PING فرمان موجود است و print بیرون PONG در پاسخ. سیگنال با Django ایجاد می شود Signal کلاس، و توسط هر تابعی که دارای این باشد دریافت می شود @receiver دکوراتور

خروجی اسکریپت:

$ python signal_demo.py

PING
PONG

به طور معمول، ما باید به آن استناد کنیم pong() عملکرد از درون ping() تابع، اما با سیگنال ها، می توانیم یک راه حل مشابه اما جدا شده به دست آوریم. را pong() تابع اکنون می تواند در پروژه فایل دیگری ساکن باشد و همچنان به ما پاسخ دهد PING علامت.

زمان استفاده از سیگنال ها

ما قبلاً مشخص کرده‌ایم که سیگنال‌های جنگو چیست و چگونه کار می‌کنند، اما مانند هر ویژگی فریمورک دیگری، قرار نیست در هر مرحله از آن استفاده شود. سناریوهای خاصی وجود دارد که در آنها به شدت توصیه می شود از سیگنال های جنگو استفاده کنیم، و آنها عبارتند از:

  • هنگامی که تعداد زیادی کد مجزا داریم که به رویدادهای مشابه علاقه دارند، یک سیگنال به توزیع اعلان رویداد کمک می کند، در حالی که ما همه کدهای مختلف را در یک نقطه فراخوانی می کنیم، که می تواند نامرتب شود و اشکال ایجاد کند.
  • همچنین می‌توانیم از سیگنال‌های جنگو برای مدیریت تعاملات بین اجزا در یک سیستم جداشده به عنوان جایگزینی برای تعامل از طریق مکانیسم‌های ارتباطی RESTful استفاده کنیم.
  • سیگنال‌ها همچنین هنگام گسترش کتابخانه‌های شخص ثالث در جایی که می‌خواهیم از اصلاح آن‌ها اجتناب کنیم، مفید هستند، اما نیاز به افزودن عملکرد اضافی داریم.

مزایای سیگنال ها

Django Signals پیاده سازی سیستم های جدا شده ما را به روش های مختلف ساده می کند. آن‌ها به ما کمک می‌کنند تا برنامه‌های قابل استفاده مجدد را پیاده‌سازی کنیم و به جای اجرای مجدد عملکردها به طور جداگانه، یا اصلاح سایر بخش‌های سیستم، می‌توانیم فقط به سیگنال‌ها پاسخ دهیم بدون اینکه روی کدهای دیگر تأثیر بگذاریم. به این ترتیب، اجزای یک سیستم را می توان بدون دست زدن به پایگاه کد موجود، اصلاح، اضافه یا حذف کرد.

سیگنال ها همچنین مکانیزم ساده شده ای را برای همگام نگه داشتن اجزای مختلف یک سیستم جداشده و به روز با یکدیگر ارائه می دهند.

پروژه نمایشی

در پروژه آزمایشی خود، ما یک تابلوی مشاغل ساده ایجاد خواهیم کرد که در آن کاربران به سایت دسترسی خواهند داشت، مشاغل موجود را مشاهده می کنند و یک پست شغلی را برای اشتراک انتخاب می کنند. کاربران فقط با ارسال آدرس ایمیل خود مشترک می شوند و از هرگونه تغییر در کار مطلع می شوند. به عنوان مثال، اگر شرایط تغییر کند، فرصت شغلی بسته می شود، یا اگر آگهی کاری حذف شود. همه این تغییرات توسط مدیری انجام می شود که داشبوردی برای ایجاد، به روز رسانی و حتی حذف آگهی های شغلی دارد.

با روحیه جداسازی برنامه خود، ما برنامه اصلی Jobs Board و یک برنامه جداگانه Notifications را ایجاد خواهیم کرد که وظیفه دارد در صورت لزوم به کاربران اطلاع دهد. سپس از سیگنال‌هایی برای فراخوانی عملکرد در برنامه Notifications از برنامه اصلی Jobs Board استفاده می‌کنیم.

یکی دیگر از گواهی‌های مجموعه ویژگی‌های گسترده جنگو، داشبورد داخلی داخلی است که مدیران ما از آن برای مدیریت مشاغل استفاده خواهند کرد. کار ما روی این قسمت به شدت کاهش می یابد و ما می توانیم برنامه خود را سریعتر نمونه سازی کنیم.

راه اندازی پروژه

ساختن پروژه های پایتون در یک محیط مجازی تمرین خوبی است تا در یک محیط ایزوله کار کنیم که بر تنظیمات پایتون سیستم تاثیری نداشته باشد، بنابراین از آن استفاده خواهیم کرد. pipenv.

اجازه دهید ابتدا محیط خود را تنظیم کنیم:

# Set up the environment
$ pipenv install --three

# Activate the virtual environment
$ pipenv shell

# Install Django
$ pipenv install django

جنگو با برخی از دستورات ارائه می شود که به ما کمک می کند کارهای مختلفی مانند ایجاد پروژه، ایجاد برنامه ها، انتقال داده ها و تست کد و غیره را انجام دهیم. برای ایجاد پروژه ما:

# Create the project
$ django-admin startproject jobs_board && cd jobs_board

# Create the decoupled applications
$ django-admin startapp jobs_board_main
$ django-admin startapp jobs_board_notifications

دستورات بالا یک پروژه جنگو با دو برنامه در داخل آن ایجاد می کند که از یکدیگر جدا شده اند اما هنوز هم می توانند با هم کار کنند. برای تأیید موفقیت آمیز بودن راه‌اندازی، اجازه دهید مهاجرت‌های پیش‌فرض را که با جنگو ارائه می‌شود، منتقل کرده و پایگاه داده و جداول خود را تنظیم کنیم:

$ python manage.py migrate
$ python manage.py runserver

هنگامی که به نمونه در حال اجرا محلی پروژه جنگو خود دسترسی پیدا می کنیم، باید موارد زیر را مشاهده کنیم:

جنگو راه اندازی شد

این بدان معناست که ما پروژه جنگو خود را با موفقیت راه اندازی کرده ایم و اکنون می توانیم منطق خود را پیاده سازی کنیم.

پیاده سازی

جنگو مبتنی است روی یک الگوی معماری مدل-نما-الگو، و این الگو همچنین اجرای ما را راهنمایی خواهد کرد. ما مدل‌هایی را برای تعریف داده‌های خود ایجاد می‌کنیم، سپس نماهایی را برای مدیریت دسترسی و دستکاری داده‌ها پیاده‌سازی می‌کنیم، و در نهایت الگوهایی برای ارائه داده‌هایمان به کاربر نهایی روی مرورگر

برای ادغام برنامه هایمان در برنامه اصلی جنگو، باید آنها را به برنامه اضافه کنیم jobs_board/settings.py زیر INSTALLED_APPS، به شرح زیر است:

INSTALLED_APPS = (
    

    
    'jobs_board_main',
    'jobs_board_notifications',
)

قسمت 1: برنامه صفحه اصلی مشاغل

این جایی است که بخش عمده ای از عملکرد سیستم ما قرار دارد و نقطه تعامل با کاربران ما خواهد بود. این شامل مدل‌ها، نماها و الگوهای ما و برخی سیگنال‌های سفارشی است که برای تعامل با برنامه Notifications استفاده می‌کنیم.

بیایید با ایجاد مدل های خود شروع کنیم jobs_board_main/models.py:



class Job(models.Model):
    company = models.CharField(max_length=255, blank=False)
    company_email = models.CharField(max_length=255, blank=False)
    title = models.CharField(max_length=255, blank=False)
    details = models.CharField(max_length=255, blank=True)
    status = models.BooleanField(default=True)
    date_created = models.DateTimeField(auto_now_add=True)
    date_modified = models.DateTimeField(auto_now=True)

class Subscriber(models.Model):
    email = models.CharField(max_length=255, blank=False, unique=True)
    date_created = models.DateTimeField(auto_now_add=True)
    date_modified = models.DateTimeField(auto_now=True)

class Subscription(models.Model):
    email = models.CharField(max_length=255, blank=False, unique=True)
    user = models.ForeignKey(Subscriber, related_name="subscriptions", on_delete=models.CASCADE)
    job = models.ForeignKey(Job, related_name="jobs", on_delete=models.CASCADE)
    date_created = models.DateTimeField(auto_now_add=True)
    date_modified = models.DateTimeField(auto_now=True)

ما یک مدل برای تعریف خود ایجاد می کنیم Job پستی که فقط نام شرکت و مشخصات شغلی را در کنار وضعیت باز شدن شغل خواهد داشت. ما همچنین مدلی برای ذخیره مشترکین خود با گرفتن آدرس ایمیل آنها خواهیم داشت. مشترکین و مشاغل از طریق Subscription مدلی که ما جزئیات را در آن ذخیره خواهیم کرد روی اشتراک در آگهی های شغلی

با وجود مدل‌های خود، باید مهاجرت‌ها را انجام داده و آنها را مهاجرت کنیم تا جداول در پایگاه داده ایجاد شوند:

$ python manage.py makemigrations
$ python manage.py migrate

بعد حرکت می کنیم روی به بخش مشاهده برنامه ما. بیایید یک نمای برای نمایش همه آگهی‌های شغلی و دیگری برای نمایش آگهی‌های شغلی جداگانه ایجاد کنیم که کاربران می‌توانند با ارسال ایمیل‌های خود در آن‌ها مشترک شوند.

ما با ایجاد نمایه ای شروع می کنیم که نمایش تمام مشاغل ما را کنترل می کند:



from .models import Job

def get_jobs(request):
    
    jobs = Job.objects.all()
    return render(request, 'jobs.html', {'jobs': jobs})

برای این پروژه از نماهای مبتنی بر تابع استفاده خواهیم کرد که جایگزین آن نماهای مبتنی بر کلاس است، اما این بخشی از این بحث نیست. ما از پایگاه داده برای همه مشاغل پرس و جو می کنیم و با مشخص کردن قالبی که مشاغل را ارائه می دهد و همچنین مشاغل را در پاسخ به درخواست پاسخ می دهیم.

جنگو با موتور قالب جینجا که ما از آن برای ایجاد فایل های HTML که به کاربر نهایی رندر می شوند استفاده خواهیم کرد. در ما jobs_board_main برنامه، ما یک را ایجاد خواهیم کرد templates پوشه ای که خواهد شد host تمام فایل های HTML که ما برای کاربران نهایی ارائه خواهیم کرد.

الگوی رندر کردن همه مشاغل، همه مشاغل را با پیوندهایی به آگهی‌های شغلی به صورت زیر نمایش می‌دهد:


<!DOCTYPE html>
<html>
  <head>
    <title>Jobs Board Homepage</title>
  </head>
  <body>
    <h2> Welcome to the Jobs board </h2>

    {% for job in jobs %}
      <div>
        <a href="/jobs/{{ job.id }}">{{ job.title }} at {{ job.company }}</a>
        <p>
          {{ job.details }}
        </p>
      </div>
    {% endfor %}

  </body>
</html>

ما ایجاد کرده ایم Job مدل، get_jobs مشاهده برای دریافت و نمایش همه نماها، و الگو برای ارائه فهرست مشاغل. برای گرد هم آوردن همه این کارها، باید یک نقطه پایانی ایجاد کنیم که از طریق آن مشاغل قابل دسترسی باشند، و این کار را با ایجاد یک urls.py فایل در ما jobs_board_main_application:



from django.urls import path
from .views import get_jobs

urlpatterns = (
    
    path('jobs/', get_jobs, name="jobs_view"),
)

در این فایل ما import دیدگاه ما، یک مسیر ایجاد کنید و دیدگاه ما را به آن متصل کنید. ما اکنون URL برنامه های خود را به صورت اصلی ثبت می کنیم urls.py فایل در jobs_board پوشه پروژه:



urlpatterns = (
    path('admin/', admin.site.urls),
    path('', include('jobs_board_main.urls')), 
)

پروژه ما اکنون آماده آزمایش است. این چیزی است که وقتی برنامه را اجرا می کنیم و به آن پیمایش می کنیم، دریافت می کنیم localhost:8000/jobs:

جابز فرود تخته 1

در حال حاضر هیچ شغلی نداریم. جنگو با یک برنامه مدیریتی ارسال می‌شود که می‌توانیم از آن برای انجام ورود اطلاعات خود استفاده کنیم. ابتدا با ایجاد یک superuser شروع می کنیم:

ابر کاربر ایجاد کنید

با ایجاد ابرکاربر، باید مدل های خود را در آن ثبت کنیم admin.py فایل در ما jobs_board_main کاربرد:


from django.contrib import admin
from .models import Job


admin.site.register(Job)

ما برنامه خود را مجددا راه اندازی می کنیم و به آن می رویم localhost:8000/admin و با اعتباری که به تازگی تنظیم کرده ایم وارد شوید. این هم نتیجه:

ادمین هیئت شغلی 1

وقتی کلیک می کنیم روی علامت مثبت روی در ردیف “شغل”، فرمی دریافت می کنیم که در آن جزئیات مربوط به پست شغلی خود را پر می کنیم:

ورود اطلاعات مشاغل

وقتی کار را ذخیره می کنیم و به قسمت باز می گردیم jobs نقطه پایانی، با پست کاری که به تازگی ایجاد کرده ایم به استقبال ما می آید:

jobs board landing 2

اکنون نماها، الگوها و URL ها را برای نمایش یک کار ایجاد می کنیم و همچنین به کاربران اجازه می دهیم با ارسال ایمیل خود مشترک شوند.

ما jobs_board_main/views.py به شرح زیر تمدید خواهد شد:



def get_job(request, id):
    job = Job.objects.get(pk=id)
    return render(request, 'job.html', {'job': job})

def subscribe(request, id):
    job = Job.objects.get(pk=id)
    sub = Subscriber(email=request.POST('email'))
    sub.save()

    subscription = Subscription(user=sub, job=job)
    subscription.save()

    payload = {
      'job': job,
      'email': request.POST('email')
    }
    return render(request, 'subscribed.html', {'payload': payload})

همچنین باید الگوی یک نما از یک آگهی شغلی را ایجاد کنیم templates/job.html، که شامل فرمی است که در ایمیل کاربر گرفته می شود و آنها را در پست کاری مشترک می کند:


<html>
  <head>
    <title>Jobs Board - {{ job.title }}</title>
  </head>
  <body>
      <div>
        <h3>{{ job.title }} at {{ job.company }}</h3>
        <p>
          {{ job.details }}
        </p>
        <br>
        <p>Subscribe to this job posting by submitting your email</p>
        <form action="/jobs/{{ job.id }}/subscribe" method="POST">
          {% csrf_token %}
          <input type="email" name="email" id="email" placeholder="Enter your email"/>
          <input type="submit" value="Subscribe">
        </form>
        <hr>
      </div>
  </body>
</html>

هنگامی که کاربر در یک کار مشترک شد، باید او را به تأییدیه هدایت کنیم page که subscribed.html قالب به صورت زیر خواهد بود:


<!DOCTYPE html>
<html>
  <head>
    <title>Jobs Board - Subscribed</title>
  </head>
  <body>
      <div>
        <h3>Subscription confirmed!</h3>
        <p>
          Dear {{ payload.email }}, thank you for subscribing to {{ payload.job.title }}
        </p>
      </div>
  </body>
</html>

در نهایت، عملکرد جدید ما باید از طریق نقاط پایانی در معرض دید قرار گیرد که ما به موجود خود اضافه خواهیم کرد jobs_board_main/urls.py به شرح زیر است:


from .views import get_jobs, get_job, subscribe

urlpatterns = (
    
    path('jobs/', get_jobs, name="jobs_view"),
    path('jobs/<int:id>', get_job, name="job_view"),
    path('jobs/<int:id>/subscribe', subscribe, name="subscribe_view"),
)

اکنون می‌توانیم برنامه اصلی Jobs Board خود را با مشاهده لیست پست‌های شغلی و کلیک کردن آزمایش کنیم روی یک، و ارسال یک آدرس ایمیل که به روز رسانی ها را دریافت می کند.

اکنون که یک برنامه کاربردی داریم، زمان آن فرا رسیده است که سیگنال های جنگو را وارد کنیم و در صورت وقوع رویدادهای خاصی به کاربران/مشترکین اطلاع دهیم. آگهی های شغلی مربوط به شرکت خاصی است که ایمیل آن را ضبط می کنیم. ما می خواهیم زمانی که کاربر جدیدی در پست کاری آنها مشترک می شود به آنها اطلاع دهیم. ما همچنین می‌خواهیم به کاربرانی که مشترک شده‌اند، در صورت حذف یک پست شغلی اطلاع دهیم.

برای اطلاع دادن به کاربران در صورت حذف یا حذف یک پست شغلی، از داخلی جنگو استفاده خواهیم کرد. post_delete علامت. ما همچنین سیگنال خود را به نام ایجاد خواهیم کرد new_subscriber زمانی که کاربران در پست کاری خود مشترک می شوند، از آن برای اطلاع رسانی به شرکت ها استفاده خواهیم کرد.

ما سیگنال های سفارشی خود را با ایجاد a ایجاد می کنیم signals.py فایل در ما jobs_board_main کاربرد:


from django.dispatch import Signal

new_subscriber = Signal(providing_args=("job", "subscriber"))

خودشه! سیگنال سفارشی ما پس از اینکه کاربر با موفقیت در یک پست شغلی مشترک شد، آماده فراخوانی است. jobs_board_main/views.py فایل:




from .signals import new_subscriber

def subscribe(request, id):
    job = Job.objects.get(pk=id)
    subscriber = Subscriber(email=request.POST('email'))
    subscriber.save()

    subscription = Subscription(user=subscriber, job=job, email=subscriber.email)
    subscription.save()

    
    new_subscriber.send(sender=subscription, job=job, subscriber=subscriber)

    payload = {
      'job': job,
      'email': request.POST('email')
    }
    return render(request, 'subscribed.html', {'payload': payload})

ما لازم نیست نگران باشیم pre_delete سیگنال را به عنوان جنگو به طور خودکار برای ما ارسال می کند درست قبل از اینکه یک پست شغلی حذف شود. دلیلی که ما استفاده می کنیم pre_delete و نه post_delete سیگنال به این دلیل است که، زمانی که a Job حذف می شود، تمام اشتراک های پیوند داده شده نیز در قسمت حذف می شوند process و قبل از اینکه آنها نیز حذف شوند به آن داده ها نیاز داریم.

اجازه دهید اکنون سیگنال هایی را که به تازگی ارسال کرده ایم به صورت جداگانه مصرف کنیم jobs_board_notifications برنامه

بخش 2: برنامه اعلان‌های هیئت شغلی

ما قبلا ایجاد کردیم jobs_board_notifications برنامه و آن را به پروژه جنگو وصل کردیم. در این بخش، سیگنال های ارسال شده از اپلیکیشن اصلی خود را مصرف کرده و اعلان ها را ارسال می کنیم. جنگو دارای قابلیت داخلی برای ارسال ایمیل است، اما برای اهداف توسعه، ما این کار را انجام خواهیم داد print پیام ها به console بجای.

ما jobs_board_notifications برنامه نیازی به تعامل کاربر ندارد، بنابراین، ما نیازی به ایجاد نما یا قالب برای این منظور نداریم. تنها هدف ماست jobs_board_notifications دریافت سیگنال و ارسال اعلان است. ما این قابلیت را در خود پیاده سازی خواهیم کرد models.py از آنجایی که هنگام شروع برنامه، زود وارد می شود.

اجازه دهید سیگنال های خود را در خود دریافت کنیم jobs_board_notifications/models.py:


from django.db.models.signals import pre_delete
from django.dispatch import receiver

from jobs_board_main.signals import new_subscriber
from jobs_board_main.models import Job, Subscriber, Subscription

@receiver(new_subscriber, sender=Subscription)
def handle_new_subscription(sender, **kwargs):
    subscriber = kwargs('subscriber')
    job = kwargs('job')

    message = """User {} has just subscribed to the Job {}.
    """.format(subscriber.email, job.title)

    print(message)

@receiver(pre_delete, sender=Job)
def handle_deleted_job_posting(**kwargs):
    job = kwargs('instance')

    
    subscribers = Subscription.objects.filter(job=job)

    for subscriber in subscribers:
        message = """Dear {}, the job posting {} by {} has been taken down.
        """.format(subscriber.email, job.title, job.company)

        print(message)

در ما jobs_board_notifications، ما import سیگنال سفارشی ما، pre_save سیگنال و مدل های ما با استفاده از @receiver دکوراتور، سیگنال ها و داده های متنی ارسال شده با آنها را به عنوان آرگومان های کلمه کلیدی می گیریم.

پس از دریافت داده های متنی، از آن برای ارسال “ایمیل” استفاده می کنیم (به یاد داشته باشید که ما فقط در حال چاپ به console به خاطر سادگی) به مشترکین و شرکت ها زمانی که یک کاربر مشترک می شود و یک پست شغلی با پاسخ به سیگنال هایی که ما ارسال می کنیم حذف می شود.

آزمایش کردن

هنگامی که یک شغل در داشبورد مدیریت خود ایجاد کردیم، برای مشترک شدن کاربران در دسترس است. هنگامی که کاربران مشترک می شوند، ایمیل زیر از سایت ارسال می شود jobs_board_notifications درخواست برای شرکتی که صاحب پست است:

پیام اشتراک شغل

این گواه این است که ما new_subscriber سیگنال از jobs_board_main درخواست و دریافت شده توسط jobs_board_notifications کاربرد.

هنگامی که یک آگهی شغلی حذف می شود، همه کاربرانی که در آگهی استخدام مشترک شده اند از طریق ایمیل به شرح زیر مطلع می شوند:

ایمیل کار حذف شد

جانگو pre_delete سیگنال به کار آمد و کنترل کننده ما اعلان هایی را برای کاربران مشترک ارسال کرد مبنی بر اینکه پست کاری خاص حذف شده است.

خلاصه

در این مقاله ما یک پروژه جنگو با دو برنامه کاربردی ساخته‌ایم که از طریق سیگنال‌های جنگو در پاسخ به رویدادهای خاص ارتباط برقرار می‌کنند. دو برنامه ما از هم جدا شده اند و پیچیدگی در ارتباط بین برنامه های ما تا حد زیادی کاهش یافته است. هنگامی که یک کاربر در یک آگهی استخدام مشترک می شود، ما به شرکت اطلاع می دهیم. به نوبه خود، هنگامی که یک آگهی شغلی حذف شد، ما به همه مشتریان مشترک اعلام می کنیم که آگهی کار حذف شده است.

با این حال، مواردی وجود دارد که باید هنگام استفاده از Django Signals در نظر داشته باشیم. هنگامی که سیگنال ها به خوبی مستند نشده باشند، نگهدارنده های جدید ممکن است برای شناسایی آن مشکل داشته باشند root علت مسائل خاص یا رفتار غیر منتظره بنابراین، زمانی که سیگنال‌ها در یک برنامه کاربردی استفاده می‌شوند، ایده خوبی است که سیگنال‌های مورد استفاده، محل دریافت و دلیل پشت آن‌ها را مستند کنید. این به هر کسی که کد را حفظ می کند کمک می کند تا رفتار برنامه را درک کند و مشکلات را سریعتر و بهتر حل کند. همچنین، توجه به این نکته مفید است که سیگنال ها به صورت همزمان ارسال می شوند. آنها در پس زمینه یا توسط هیچ کار ناهمزمانی اجرا نمی شوند.

با تمام این اطلاعات در مورد سیگنال های جنگو و پروژه آزمایشی، ما باید بتوانیم از قدرت سیگنال ها در پروژه های وب جنگو خود استفاده کنیم.

کد منبع این پروژه موجود است اینجا روی GitHub.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-21 01:19:06

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید