django 訊號
django存在一個’訊號排程程式’, 可以實現當某事件在框架內發生時,通知到我們的應用程式。比如當某個時間(event)發生時允許若干寄件人(sender)通知一組接受者(receivers)
Django includes a “signal dispatcher” which helps allow decoupled applications get notified when actions occur elsewhere in the framework. In a nutshell, signals allow certain senders to notify a set of receivers that some action has taken place. They’re especially useful when many pieces of code may be interested in the same events.
具體比如, 當某個使用者被建立後, 會通知某個程式, 建立一個token, 類似於mysql觸發器.
Model signals可以分為一下幾種:
pre_init 某個例項馬上要初始化了
post_init 某個例項已經初始化了
pre_save 個例項即將要儲存入庫了
post_save 某個例項即已經儲存入庫了
pre_delete 某個例項即將要刪除了
post_delete 某個例項即已經刪除了
class_prepared 某個class準備好了
m2m_changed 模型的ManyToManyField改變時觸發
使用:
場景1: 建立使用者後加密密碼(因某種原因存入資料庫的是明文)
- 在apps/user下新建
signals.py
from django.contrib.auth import get_user_model
from django.db.models.signals import post_save
from django.dispatch import receiver
User = get_user_model()
@receiver(post_save, sender=User)
def create_user(sender, instance=None, created=False, **kwargs):
if created:
password = instance.password
instance.set_password(password)
instance.save()
signal接受函式需要確保將此程式碼段放置在已安裝的models.py模組或Django在啟動時匯入的其他位置
- 載入signals設定: apps/users/init.py中填寫:
default_app_config = 'users.apps.UsersConfig'
- 隨後在apps/user/app.py的config類下重寫ready方法:
from django.apps import AppConfig
class UsersConfig(AppConfig):
pass
def ready(self):
import users.signals
場景2: 生成token
如果你希望每個使用者擁有自動生成的令牌,你可以簡單地捕獲使用者的post_save訊號。
原文: jango-REST-framework-documentation
from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)
參考:
相關文章
- django的訊號量Django
- Django | 訊號使用思考Django
- Django的訊號機制詳解Django
- Django中的內建訊號有哪些Django
- Django訊號與擴充套件:深入理解與實踐Django套件
- 深入理解Django:中介軟體與訊號處理的藝術Django
- 音訊訊號表徵音訊
- 程序通訊-訊號
- 程序通訊--訊號
- 細說 ReactiveCocoa 的冷訊號與熱訊號(三):怎麼處理冷訊號與熱訊號React
- SIGALRM訊號和SIGCHID訊號GC
- Bold訊號與fNIRS訊號的區別
- Django2.1視訊教程Django
- 3分鐘看懂Python後端必須知道的Django的訊號機制!Python後端Django
- 程序訊號
- Linux訊號機制與訊號處理Linux
- 程式間通訊——POSIX 有名訊號量與無名訊號量
- 03 . Django之騰訊雲簡訊Django
- Linux 未決訊號集與訊號遮蔽字Linux
- 分析外星訊號
- SIGCHLD訊號GC
- POSIX 訊號量
- 音訊訊號處理入門音訊
- 程序間的通訊(訊號通訊)
- 訊號、系統與訊號處理邊角雜談
- 細說 ReactiveCocoa 的冷訊號與熱訊號(1)React
- uc/os-iii學習筆記-資源管理(中斷、訊號、訊號量、互斥訊號量)筆記
- linux中的兩個非常重要的訊號:SIGALRM訊號和SIGCHID訊號LinuxGC
- Django的訊息中內嵌HTMLDjangoHTML
- 訊號課組(一) 訊號與系統 Part 0 MATLAB在訊號與系統中的使用Matlab
- linux系統程式設計之訊號(五):訊號集操作函式,訊號阻塞與未決Linux程式設計函式
- 程序間通訊(4)-訊號量
- 訊號處理第二篇——接著談正弦訊號
- Django搭建個人部落格:用django-notifications實現訊息通知Django
- liteos訊號量(八)
- 訊號與系統
- Python 訊號量Python
- C++訊號槽C++