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)
参考:
网友评论