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

آنها به شما کمک می کنند قسمت های مختلف برنامه خود را متصل کنید بدون اینکه همه چیز در کنار هم قرار بگیرد. به آنها مانند Walkie-Talkies فکر کنید-وقتی یک قسمت از کد شما چیزی را تمام می کند ، می تواند بخش دیگری را “سیگنال” کند تا بدون نیاز به دانستن همه جزئیات ، اقدام کند. بسیار مفید ، درست است؟

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

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

سیگنال های Django چیست؟

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

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

جنگو برای این کار یک سیستم داخلی دارد-و آن را به آن می گویند چارچوب سیگنال هابشر

در اینجا ایده اصلی وجود دارد:

  • یک قسمت از برنامه شما وقتی اتفاق می افتد سیگنال می فرستد.

  • بخش دیگری برای آن سیگنال گوش می دهد و با برخی اقدامات پاسخ می دهد.

این به شما کمک می کند منطق خود را از هم جدا کنید و از درهم و برهم کردن پایگاه اصلی کد خود با کارهای اضافی خودداری کنید.

پیشنهاد می‌کنیم بخوانید:  راهنمای قطعی تست واحد در برنامه های React با Jest و React-Testing به عنوان یک توسعه دهنده، یکی از مواردی که در بالای لیست شما قرار دارد باید ارسال کد بدون اشکال باشد. هیچ چیز بدتر از فهمیدن نیست روی پنجشنبه شب که تغییراتی که دادی روی دوشنبه برنامه زنده را شکست. تنها راه برای اطمینان از اینکه برنامه شما مطابق با...

نمونه های زندگی واقعی از زمان استفاده از سیگنال های Django

برای آسان تر درک این امر ، در اینجا موقعیت هایی وجود دارد که سیگنال ها می درخشند:

  • وقتی کاربر ثبت نام می کند ، می خواهید یک پروفایل را به طور خودکار ایجاد کنید.

  • وقتی شخصی ایمیل خود را به روز می کند ، و می خواهید یک پیام تأیید ارسال کنید.

  • هنگامی که یک پست وبلاگ ذخیره می شود ، و می خواهید یک فهرست جستجو را به روز کنید یا یک حافظه پنهان را پاک کنید.

  • هنگامی که یک سفارش قرار داده می شود ، و می خواهید یک اعلان را به مدیر ارسال کنید.

شما می توانید تمام این منطق را درون نماهای یا مدل های خود قرار دهید ، اما استفاده از سیگنال ها چیزها را تمیز و مدولار نگه می دارد.

سیگنال های Django چگونه کار می کنند؟

در اینجا تنظیم اساسی برای استفاده از سیگنال های Django آورده شده است:

  1. سیگنالی را که می خواهید استفاده کنید وارد کنید (مانند post_save یا pre_delete).

  2. یک تابع بنویسید (به نام a گیرنده) هنگام ایجاد سیگنال باید اجرا شود.

  3. عملکرد خود را با استفاده از دکوراتور به سیگنال وصل کنید connect() روش

بگذارید یک مثال اساسی به شما نشان دهم.

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

# accounts/signals.py
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

این اتفاق می افتد:

  • post_save یک سیگنال Django داخلی است. پس از ذخیره یک مدل شروع می شود.

  • تابع create_user_profile مال ماست گیرندهبشر این سیگنال را گوش می دهد.

  • بررسی می کند که آیا کاربر تازه ایجاد شده است (if created:) و سپس یک پروفایل ایجاد می کند.

برای انجام این کار ، شما نیز باید import سیگنال در جایی که بارگیری می شود ، مانند برنامه شما apps.py:

# accounts/apps.py
from django.apps import AppConfig

class AccountsConfig(AppConfig):
    name = 'accounts'

    def ready(self):
        import accounts.signals

بدون این ، Django نمی داند سیگنال های شما را بارگیری کند.

سیگنال های داخلی که می توانید استفاده کنید

Django چند سیگنال داخلی را به شما می دهد که بسیار مفید هستند:

نشانه هنگامی که آن را تحریک می کند
pre_save درست قبل از ذخیره یک مدل
post_save درست پس از ذخیره یک مدل
pre_delete درست قبل از حذف یک مدل
post_delete درست پس از حذف یک مدل
m2m_changed وقتی یک زمینه بسیار به یک تغییر می کند
request_finished هنگامی که یک درخواست HTTP به پایان می رسد
user_logged_in وقتی کاربر وارد سیستم می شود
user_logged_out وقتی کاربر از سیستم خارج می شود
پیشنهاد می‌کنیم بخوانید:  کشیدن و رها کردن در جاوا اسکریپت Vanilla عمل انتخاب یک آیتم یا تکه‌ای از متن، جابجایی آن (کشیدن) و سپس قرار دادن آن (رها کردن) در مکانی دیگر به عنوان قابلیت کشیدن و رها کردن شناخته می‌شود. اکثر مرورگرها انتخاب متن، تصاویر و پیوندها را به طور پیش فرض قابل کشیدن می کنند. برای مثال، اگر تصاویر یا نشان‌واره‌های مبتنی بر تصویر را بکشید روی هر ...

می توانید لیست کامل را در اینجا پیدا کنید.

سیگنال های سفارشی (بله ، شما می توانید خود را بسازید)

بعضی اوقات ، سیگنال های داخلی کافی نیستند. مشکلی نیست – Django به شما امکان می دهد خود را ایجاد کنید. در اینجا یک مثال آورده شده است:

# myapp/signals.py
from django.dispatch import Signal

order_placed = Signal()

# In your views or logic
order_placed.send(sender=None)

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

در صورت عدم استفاده از سیگنال ها

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

  • اگر منطق ساده و محکم به یک نمای یا مدل گره خورده است ، فقط آن را در آنجا قرار دهید.

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

  • اگر می خواهید همه چیز بسیار شفاف باشد. سیگنال ها می توانند کمی “نامرئی” باشند ، که باعث می شود شخص دیگری که کد شما را می خواند بفهمد چه اتفاقی می افتد onبشر

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

متداول

آیا سیگنال های Django همزمان یا ناهمزمان هستند؟

سیگنال ها به طور پیش فرض همزمان هستند ، به این معنی که بلافاصله اجرا می شوند. اما می توانید با استفاده از ابزارهایی مانند کرفس ، کارهای Async (مانند ارسال ایمیل) را در داخل آنها ایجاد کنید.

آیا سیگنال ها برنامه من را کند می کنند؟

در واقع ، مگر اینکه کار داخل سیگنال سنگین باشد (مانند ارسال ایمیل یا نوشتن پرونده های بزرگ). برای این کار ، شما باید کار را به یک کارگر پس زمینه منتقل کنید.

آیا سیگنال ها می توانند بی صدا شکست بخورند؟

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

افکار نهایی

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

آنها یکی از آن ابزارهایی هستند که در ابتدا کمی جادویی احساس می کنند ، اما وقتی درک کردید که چگونه کار می کنند ، آنها فقط حس می کنند.

بنابراین ، بخشی از پروژه Django شما چیست که می تواند از اتوماسیون کمی پشت صحنه با سیگنال استفاده کند؟

منابع بیشتر

اگر می خواهید عمیق تر به سیگنال های Django و بهترین روش ها شیرجه بزنید ، در اینجا چند مکان خوب برای بررسی وجود دارد:

  • اسناد رسمی سینگو رسمی

  • راهنمای واقعی پایتون برای سیگنال های Django

  • درک سیگنال های Django (YouTube – Simple بهتر از پیچیده است)

  • کرفس برای کارهای پس زمینه (برای کارهای سیگنال سنگین)