美文网首页
django 信号

django 信号

作者: 入间 | 来源:发表于2018-07-10 19:17 被阅读0次

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)

参考:

相关文章

  • Django 框架之 Django信号

    知识点 概念 如何监听信号 Django内置信号 自定义信号 使用Django内置信号 概念 Django 提供一...

  • django 信号

    django存在一个’信号调度程序’, 可以实现当某事件在框架内发生时,通知到我们的应用程序。比如当某个时间(ev...

  • Django信号

    转载:https://blog.csdn.net/healthy_coder/article/details/52...

  • Django - 信号

    引出:想对每个增加数据给写条日志。 Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些...

  • Django 信号

    Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者...

  • Django Signals(信号)监听模型或某一字段变化

    欢迎访问我的博客查看 我的博客 Django信号 Django 提供一个“信号分发器”,允许解耦的应用在框架的其...

  • Django 源码解读-signal实现(一)

    signal在django中用于发送通知,在django中内置的信号包括 post_save, pre_delet...

  • django-信号

    Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者...

  • Django信号触发

    编写的信号总是不能触发。信号触发主要需要三个条件: 1.信号能正常工作 2.在app的config中触发信号 3....

  • django-cache

    以前学习django缓存,视频看的云里雾里,今天读到一篇文章豁然开朗,以此记录。感谢!链接:[Django缓存和信号

网友评论

      本文标题:django 信号

      本文链接:https://www.haomeiwen.com/subject/oiuqpftx.html