آشنایی با Signal در جنگو

آشنایی با Signal در جنگو

سیگنال ها (Signals) در جنگو یک موضوع بسیار مهم و کاربردی است و آشنا شدن با آن در عملکرد و کارهای وبسایت شما سرعت میبخشد همانطور که در دنیای واقعی سیگنال ها وجود دارند برای مثال شما برای برقراری یک تماس یک سینگال ارسال کرده و ارائه دهنده آن سیگنال را به مخاطب شما ارسال میکند و مکالمه شما شروع میشود در جنگو نیز تقریبا قبل یا بعد از هر عملکرد(برای مثال لاگین کردن, و ... ) و تغییر در سطح پروژه یا تغییر یک آبجکت در دیتابیس ( ایجاد کردن,حذف کردن, آپدیت کردن یک آبجکت) سیگنال هایی ارسال میشود و شما میتوانید با نوشتن یک Reciver  که به آن دریافت کنند سیگنال میگوییم سیگنال خود را کنترل کنید برای مثال میتوانید یک قابلیت اضافه کنید تا اگر یک کاربر در دیتابیس شما ایجاد میشود به طور اتومات یک پروفایل برای آن ایجاد کنید

آموزش کار با سیگنال ها (Signals) در جنگو(Django):

سیگنال ها از قبل درون فریمورک جنگو نوشته شده اند و برای کار کردن با یک سیگنال در جنگو باید در ابتدا سیگنال مورد نظر را import کرده و سپس یک فانکشن به عنوان دریافت کننده سیگنال که آن را مدیریت میکند نوشته و کارهایی که میخواهید با اینجام یک سیگنال انجام شود را درون آن فانکشن پیاده میکنیم و بعد از نوشتن Reciver خود باید سیگنال خود را به اپ معرفی کنیم که در ادامه خواهید دید حال  قبل از شروع نوشتن اولین فانکشن برای سیگنال خود خوب است با سیگنال های Bulit-in در جنگو(Django) آشنا شویم

انواع سیگنال ها در جنگو(Django):

پیشنهاد میشود در هنگام مطالعه این بخش وارد بخش سیگنال ها در وبسایت رسمی جنگو شوید:سیگنال ها در جنگو

  • Model signals:(شامل سیگنال هایی از مدلاسیون جنگو اند که شما میتوانید بعد از هر تغییر در سطح دیتابیس خود این سیگنال ها را دریافت و با آنها کار کنید برای مثال یک سیگنال برای حذف شدن یک آبجکت از یک مدل را میتوانیم دریافت کنیم و کارهای مورد نیازمان را انجام دهیم)
  • Management signals:(این دسته از سیگنال ها سیگنال های مدیریتی در جنگو اند که شامل pre_migrate و post_migrate اند در واقع هنگامی است که شما migrate را در پروژه خود لحاظ میکنید)
  • Request/response signals:(همانطور که از نامشان پیداست شامل سیگنال های ریکوئست و ریسپانس میباشند یعنی هنگامی که یک کاربر به وبسایت شما درخواست ارسال میکند و همچنین زمانی که به آن پاسخ میدهید برای شما سیگنال هایی ارسال میکند که با نوشتن Reciver مورد نظر میتوانید آن را مدیریت کنید)
  • Test signals:(این دسته از سیگنال ها زمانی ارسال میشوند که شما تست های پروژه خود را Run کنید)
  • Database Wrappers:(شامل سیگنالی است که از دیتابیس ارسال میشود زمانی که دیتابیس به پروژه متصل میشود)
  • سیگنال های اپ auth:(علاوه بر این سیگنال های اپ auth نیز سیگنال هایی را ارائه میدهد  برای مثال زمانی که یک کاربر در وبسایت شما login یا logout میکند سیگنال هایی نیز ارسال میشود از طرف این اپ)

کار کردن سیگنال ها (Signals)در جنگو:

در این بخش به بررسی چند سیگنال پرکاربرد  میپردازیم و نحوه ی کار کردن با آن ها در Django خواهیم دید در ابتدا به مدل پروژه دقت کنید

models for blog app| signals in django sunlearn.irمدلی که ما ایجاد کرده ایم یک slugField دارد که میخواهیم پس از سیو کردن هر مقاله اگر مقدار اسلاگ خالی باشد خودمان به طور اتومات آن را تولید کرده و سیو کنیم برای این کار باید از سیگنال post_save از سیگنال های مدل استفاده کنیم که در ابتدا به بررسی این سیگنال و اطلاعاتی که برای Reciver ما ارسال میکند میپردازیم و سپس به مدیریت آن میپردازیم

سیگنال post_save: این سیگنال زمانی ارسال میشود که متد ()save برای یک آبجکت فراخوانی شود و این سیگنال وقتی که یک آبجکت سیو شود ارسال میشود

آرگومان هایی که همراه این سیگنال ارسال میشود:

  • sender همان کلاس مدل  شماست که سیگنال از آن ارسال میشود
  • instance: یک نمونه از آن کلاس شما که save شده است  
  • created:  یک boolean است که اگر نمونه شما ایجاد شود برابر True میباشد
  • raw : یک boolean است که اگر مدل همانطور که ارائه شده ذخیره شود و نباید سایر ریکورد های دیتابیس را پرس و جو یا تغییر دهد
  • using: نام دیتابیس درحال استفاده را برمیگرداند
  • update_fields:  فیلد هایی که آپدیت شده اند را میدهد

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

آموزش ایجاد کردن یک Reciver  برای سیگنال در جنگوتوضیحات فایل signals.py:

همانطور که گفتیم ما باید سیگنال ها را از طریق Reciver  دریافت کنیم و تابع ای برای مدیریت هنگام به وجود آمدن این سیگنال بسازیم ما یک تابع برای ایجاد کردن اسلاگ به طور اتومات برای مقالات خود ایجاد کردیم و در آرگومان های ورودی آن آرگومان هایی که سیگنال post_save برای ما ارسال میکند را دریافت و در صورت نیاز از آن ها استفاده کنیم توجه کنید که حتما kwargs** را نیز قرار دهید زیرا اگر وجود نداشته باشد به ارور برمیخورید خب در بدنه این تابع چک میکنیم که آیا instance که همان نمونه از یک مقاله است اسلاگ دارد یا خیر اگر نداشت با استفاده از تابع  slugify در جنگو که برای تبدیل کردن متون انگلیسی به متن قابل قبول برای اسلاگ است یک اسلاگ با استفاده از title آن مقاله ایجاد میکنیم و سپس مقاله مورد نظر را save میکنیم بعد از نوشتن تابع reciver نیاز است تا از دکوریتور reciver در جنگو استفاده کنیم که این امکان را به تابع ما میدهد که یک سیگنال را دریافت و بتواند آن را مدیریت و کنترل کند و به عنوان آرگومان های ورودی برای reciver ارسال کننده سیگنال که در اینجا مدل Article میباشد و همچنین سیگنال مورد نظر را به ان پاس میدهیم که سیگنال ما سیگنال post_save از سری سیگنال های دیتابیس است که زمانی که یک مقاله ایجاد یا آپدیت میشود یا بهتر است بگوییم متد save در یک مقاله فراخوانی میشود این سیگنال از طرف مدل مورد نظر ارسال میشود پس از انجام این مراحل نیاز است تابع reciver خود را در فایل apps.py اپ خود ریجستر کنیم که تابع ما اجرا شود در غیر این صورت reciver ما کار نخواهد کرد در کلاس Config اپ خود در قسمت تابع ready خود فایل signals.py خود را ایمپورت میکنیم

مقاله پیشنهادی:آموزش اسلاگ فارسی در جنگو

اضافه کردن signals.py درون فایل apps.py | سان لرن | آموزش کار با سیگنال ها در جنگوسیگنال user_logged_in: این سیگنال یکی از سیگنال های اپ auth میباشد که در هنگامی که یک کاربر در وبسایت شما با موفقیت لاگین میکند از طرف مدل User موجود در اپ auth ارسال میشود

آرگومان های سیگنال user_logged_in:

  • sender: ارسال کننده سیگنال که مدل مورد نظر که همان مدل User میباشد
  • request: یک نمونه از HttpRequest
  • user: یک نمونه از همان کاربر که در وبسایت شما login کرده است و با استفاده از user به آن کاربر دسترسی دارید

کار کردن با سیگنال user_logged_in:

مانند سیگنال قبل نیاز است در ابتدا سیگنال مورد نظر را از مسیر django.contrib.auth.signals ایمپورت کنیم و تابع مورد نظر خود را ایجاد و کارهایی که بعد از لاگین یک کاربر در وبسایت میخواهیم انجام شود را بنویسم که ما در اینجا میخواهیم بعد از لاگین هر کاربر یک پیغام در کنسول print شود

آموزش کار با سیگنال user_logged_in در جنگو | sunlearn.ir| سان لرنو مانند بخش قبلی با استفاده از دکوریتور reciver سیگنال مورد نظر و مدل خودمان را به آن متصل میکنیم و از آنجایی که فایل signals.py را در بخش تنظیمات اپ خود قرار داده ایم سیگنال ما کار میکند و دیگر نیازی به ایمپورت مجدد نیست چون هر بار تمام محتویات این فایل ایمپورت میشود و اگر الان یک کاربر در وبسایت شما لاگین کند با پیغام hi در کنسول مواجه میشوید و شما میتوانید کارهای مورد نیاز برای لاگین کاربر را با توجه به پروژه و ایده خود پیاده کنید برای مثال میتوانید یک پیامک به شماره تلفن کاربر یا حتی یک ایمیل در صورت نیاز برای آن ارسال کنید

نتیجه گیری:

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

 

نظرات

نظر خود را اینجا بگذارید

برای درح نظر ابتدا وارد شوید !