烟台高新区网站,企业营销策划,在哪人网站要以接it项目做,宁波网站建设设计公司信息Django的信号机制详解
Django提供一种信号机制。其实就是观察者模式#xff0c;又叫发布-订阅(Publish/Subscribe) 。当发生一些动作的时候#xff0c;发出信号#xff0c;然后监听了这个信号的函数就会执行。
Django内置了一些信号#xff0c;比如#xff1a;
django.…Django的信号机制详解
Django提供一种信号机制。其实就是观察者模式又叫发布-订阅(Publish/Subscribe) 。当发生一些动作的时候发出信号然后监听了这个信号的函数就会执行。
Django内置了一些信号比如
django.db.models.signals.pre_save 在某个Model保存之前调用
django.db.models.signals.post_save 在某个Model保存之后调用
django.db.models.signals.pre_delete 在某个Model删除之前调用
django.db.models.signals.post_delete 在某个Model删除之后调用
django.core.signals.request_started 在建立Http请求时发送
django.core.signals.request_finished 在关闭Http请求时发送
我们要做的就是注册一个receiver函数。例如如果要在每次请求完成之后打印一行字。
可以使用回调的方式注册
# receiver
def my_callback(sender, **kwargs):print(Request finished!)# connect
from django.core.signalsimport request_finishedrequest_finished.connect(my_callback)
也可以使用装饰器的方式注册下面这段代码和上面完全是等价的。
from django.core.signalsimport request_finished
from django.dispatchimport receiverreceiver(request_finished)
def my_callback(sender, **kwargs):print(Request finished!)
receiver回调函数除了可以使用sender之外还可以使用其他一些参数比如针对pre_save函数
sender发送者如果是pre_save的话就是model class
instance实例
raw
using
update_fields
post_save()是一个比较实用函数可以支持一些联动的更新。而不必让我们每次都写在view里面。比如有用户提交了退款申请我们需要把订单的状态修改成“已退款”的状态。就可以使用信号机制而不必在每处都修改。
receiver(post_save, senderRefundForm)
deforder_state_update(sender, instance, created, **kwargs):instance.order.state REFUNDINGinstance.order.save() # 这里order是refundform的一个外键
当然这里可以写的更多更周全例如退款单取消改回状态等。
观察者是非常实用的一个设计模式Django也支持用户 自定义 一些信号。
使用
init.py
default_app_config bug_management.apps.BugManagementConfig
apps.py
from django.apps import AppConfigclass BugManagementConfig(AppConfig):name bug_managementdef ready(self):# signals are imported, so that they are defined and can be usedimport bug_management.signal
single.py
from django.shortcuts import render# Create your views here.from django.db.models import signals
from django.dispatch import receiverfrom bug_management.models import Bug_Detail
from .models import Bug_Detail#保存后 ,信号机制触发 将jiraid 更改为正确id
receiver(signals.post_save, senderBug_Detail)
def welcome_student(instance, created, **kwargs):print(保存了新bug)print(是否新创建了返回true和flase,created)print(instance)# 保存bug信息后 上传jira 返回 jiraid 替换,instance.jiraid 123