django存在一個’信號調度程序’, 可以實現當某事件在框架內發(fā)生時,通知到我們的應用程序堵腹。比如當某個時間(event)發(fā)生時允許若干寄件人(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.
具體比如, 當某個用戶被創(chuàng)建后, 會通知某個程序, 創(chuàng)建一個token, 類似于mysql觸發(fā)器.
Model signals可以分為一下幾種:
pre_init 某個實例馬上要初始化了
post_init 某個實例已經初始化了
pre_save 個實例即將要保存入庫了
post_save 某個實例即已經保存入庫了
pre_delete 某個實例即將要刪除了
post_delete 某個實例即已經刪除了
class_prepared 某個class準備好了
m2m_changed 模型的ManyToManyField改變時觸發(fā)
使用:
場景1: 創(chuàng)建用戶后加密密碼(因某種原因存入數據庫的是明文)
- 在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)
參考: