Django框架中的信号、自定义信号、注册信号、触发信号

鳄鱼君

发表文章数:642

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » Django框架中的信号、自定义信号、注册信号、触发信号

内置信号

Model signals
    pre_init                    # django的modal执行其构造方法前,自动触发
    post_init                   # django的modal执行其构造方法后,自动触发
    pre_save                    # django的modal对象保存前,自动触发
    post_save                   # django的modal对象保存后,自动触发
    pre_delete                  # django的modal对象删除前,自动触发
    post_delete                 # django的modal对象删除后,自动触发
    m2m_changed                 # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
    class_prepared              # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
Management signals
    pre_migrate                 # 执行migrate命令前,自动触发
    post_migrate                # 执行migrate命令后,自动触发
Request/response signals
    request_started             # 请求到来前,自动触发
    request_finished            # 请求结束后,自动触发
    got_request_exception       # 请求异常后,自动触发
Test signals
    setting_changed             # 使用test测试修改配置文件时,自动触发
    template_rendered           # 使用test测试渲染模板时,自动触发
Database Wrappers
    connection_created          # 创建数据库连接时,自动触发

对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数:

from django.core.signals import request_finished
from django.core.signals import request_started
from django.core.signals import got_request_exception

from django.db.models.signals import class_prepared
from django.db.models.signals import pre_init, post_init
from django.db.models.signals import pre_save, post_save
from django.db.models.signals import pre_delete, post_delete
from django.db.models.signals import m2m_changed
from django.db.models.signals import pre_migrate, post_migrate

from django.test.signals import setting_changed
from django.test.signals import template_rendered

from django.db.backends.signals import connection_created

def callback(sender, **kwargs):
    print("xxoo_callback")
    print(sender,kwargs)

xxoo.connect(callback)
# xxoo指上述导入的内容

注册信号需要先导入,假设现在我准备注册pre_init信号,就需要这样写:

def callback(sender, **kwargs):
    print("xxoo_callback")
    print(sender,kwargs)

pre_init.connect(callback) #在pre_init信号里面注册一个callback函数

这样django的modal会在执行其构造方法前,自动触发这个函数。那么我们可以吧上面的代码单独存放在django工程总目录下的bibo.py文件里面,然后在django目录下的__init__.py文件中import pibo

from django.db.models.signals import pre_init, post_init

def callback(sender, **kwargs):
    print("xxoo_callback")
    #print(sender,kwargs)
pre_init.connect(callback)

现在我们需要在app中创建一个类然后生成数据库,这个应该都可以熟练的掌握,我主要展示app下的models.py代码:

from django.db import models

class UserInfo(models.Model):
    user=models.CharField(max_length=32)

在视图views.py中创建一个urse函数,作为user路由规则的映射:

from myapp1 import models
def user(request):
    obj=models.UserInfo(user='root')  #创建一个model对象
    print('鳄鱼君Ba是一位帅哥')
    obj.save()  #保存
    return HttpResponse('ok')

现在运行代码,会在控制台输出以下信息:

xxoo_callback
鳄鱼君Ba是一位帅哥
[26/Apr/2020 16:21:04] "GET /user/ HTTP/1.1" 200 2

你已经明白了如何使用信号啦吧!再来说一下信号里面的sender和kwargs是什么,你可以打开上面的注释,看一下打印的结果是什么,其实都是参数,谁触发这个信号就会显示谁的参数:

<class 'myapp1.models.UserInfo'> {'signal': <django.db.models.signals.ModelSignal object at 0x0000000002ADD2C8>, 'args': (), 'kwargs': {'user': 'root'}}

自定义信号

其它信号的使用方法都一样,这里不在演示。django还支持自定义信号,三步操作,先创建信号,触发信号,在信号中注册函数。

1. 定义信号

import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
#pizza_done为信号名 可随便定义 触发信号需要传递两个参数"toppings", "size"

2. 注册信号

def callback(sender, **kwargs):
    print("callback")
    print(sender,kwargs)
 
pizza_done.connect(callback)

3. 触发信号

from 路径 import pizza_done
 
pizza_done.send(sender='seven',toppings=123, size=456)

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Django框架中的信号、自定义信号、注册信号、触发信号》 发布于2020-04-26

分享到:
赞(1) 赏杯咖啡

评论 抢沙发

5 + 3 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册