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: 创建用户后加密密码(因某种原因存入数据库的是明文)
  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在启动时导入的其他位置

  1. 加载signals设置: apps/users/init.py中填写:
default_app_config = 'users.apps.UsersConfig'

  1. 随后在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)

参考:

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容