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

سرفصلهای مطلب
اگر در حال ساختن هر چیزی با Django هستید و می خواهید کد شما تمیز و سازمان یافته باشد ، سیگنال های Django می توانند یک نجات دهنده باشند.
آنها به شما کمک می کنند قسمت های مختلف برنامه خود را متصل کنید بدون اینکه همه چیز در کنار هم قرار بگیرد. به آنها مانند Walkie-Talkies فکر کنید-وقتی یک قسمت از کد شما چیزی را تمام می کند ، می تواند بخش دیگری را “سیگنال” کند تا بدون نیاز به دانستن همه جزئیات ، اقدام کند. بسیار مفید ، درست است؟
می دانم ، در ابتدا می تواند کمی انتزاعی به نظر برسد. اما هنگامی که از آن آویزان شدید ، می بینید که چگونه سیگنال ها می توانند پروژه های Django شما را انعطاف پذیر تر و آسان تر مدیریت کنند – به خصوص وقتی با رویدادهایی مانند ورود کاربر ، ایجاد پروفایل یا ارسال ایمیل پس از اقدامات خاص سرو کار دارید.
بنابراین ، اگر در مورد چگونگی کار سیگنال های Django کنجکاو هستید ، چرا اهمیت دارند و چگونه می توانید از آنها در کد خود استفاده کنید ، در جای مناسب قرار دارید. بیایید همه اینها را با هم بشکنیم ، قدم به قدم.
سیگنال های Django چیست؟
به عبارت ساده ، سیگنال های Django اجازه می دهند قسمت های خاصی از برنامه شما وقتی اتفاق می افتد با یکدیگر صحبت کنند. به عنوان مثال ، هنگامی که یک کاربر جدید ثبت نام می کند ، می خواهید نمایه کاربر را به طور خودکار ایجاد کنید.
به جای اضافه کردن این منطق به کد ایجاد کاربر ، می توانید از سیگنالی که برای این رویداد گوش می دهد استفاده کنید و به طور جداگانه آن را کنترل کنید.
جنگو برای این کار یک سیستم داخلی دارد-و آن را به آن می گویند چارچوب سیگنال هابشر
در اینجا ایده اصلی وجود دارد:
-
یک قسمت از برنامه شما وقتی اتفاق می افتد سیگنال می فرستد.
-
بخش دیگری برای آن سیگنال گوش می دهد و با برخی اقدامات پاسخ می دهد.
این به شما کمک می کند منطق خود را از هم جدا کنید و از درهم و برهم کردن پایگاه اصلی کد خود با کارهای اضافی خودداری کنید.
نمونه های زندگی واقعی از زمان استفاده از سیگنال های Django
برای آسان تر درک این امر ، در اینجا موقعیت هایی وجود دارد که سیگنال ها می درخشند:
-
وقتی کاربر ثبت نام می کند ، می خواهید یک پروفایل را به طور خودکار ایجاد کنید.
-
وقتی شخصی ایمیل خود را به روز می کند ، و می خواهید یک پیام تأیید ارسال کنید.
-
هنگامی که یک پست وبلاگ ذخیره می شود ، و می خواهید یک فهرست جستجو را به روز کنید یا یک حافظه پنهان را پاک کنید.
-
هنگامی که یک سفارش قرار داده می شود ، و می خواهید یک اعلان را به مدیر ارسال کنید.
شما می توانید تمام این منطق را درون نماهای یا مدل های خود قرار دهید ، اما استفاده از سیگنال ها چیزها را تمیز و مدولار نگه می دارد.
سیگنال های Django چگونه کار می کنند؟
در اینجا تنظیم اساسی برای استفاده از سیگنال های Django آورده شده است:
-
سیگنالی را که می خواهید استفاده کنید وارد کنید (مانند
post_save
یاpre_delete
). -
یک تابع بنویسید (به نام a گیرنده) هنگام ایجاد سیگنال باید اجرا شود.
-
عملکرد خود را با استفاده از دکوراتور به سیگنال وصل کنید
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 |
وقتی کاربر از سیستم خارج می شود |
می توانید لیست کامل را در اینجا پیدا کنید.
سیگنال های سفارشی (بله ، شما می توانید خود را بسازید)
بعضی اوقات ، سیگنال های داخلی کافی نیستند. مشکلی نیست – 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 بهتر از پیچیده است)
-
کرفس برای کارهای پس زمینه (برای کارهای سیگنال سنگین)
منتشر شده در 1404-04-14 20:41:22