信号
- Djangoは操作がフレームを分離するために行われ、「信号のスケジューリング」を提供します。人気の用語は、それはいくつかのアクションが発生した時には、信号が特定の送信者が受信者の一部を思い出させることが可能です。
- アプリケーション:例えば、データベースにデータを挿入し、挿入する前にログを書き込むために、挿入後にログを書き込みます。
Model signals
pre_init # django的model执行其构造方法前,自动触发
post_init # django的model执行其构造方法后,自动触发
pre_save # django的model对象保存前,自动触发
post_save # django的model对象保存后,自动触发
pre_delete # django的model对象删除前,自动触发
post_delete # django的model对象删除后,自动触发
m2m_changed # django的model中使用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 # 创建数据库连接时,自动触发
1.信号:
ビルトインのDjangoのための信号のみ登録指定信号をプログラムが自動的にアクションをトリガー登録機能、実行すると、登録信号を、ファイルが下のプロジェクトフォルダと同じ名前で書かれ
__init__.py
たファイルだけでなく、ローカルデータベースエンジンのため、。ここpost_save例を見てみましょう__init__.py
# post_save:django的model对象保存后,自动触发 from django.db.models.signals import post_save def callback(sender,**kwargs): print("执行post_save信号") print(sender,kwargs) post_save.connect(callback)#信号连接,并调用回调函数
- views.py
def student_list(request): students = models.Student.objects.all() print(students) models.Student.objects.create(name='xxoo')#创建一个对象,用于触发信号 return render(request,'stu.html',{"students":students})
2.信号の使用法II:
- デコレータ受信機によって、複数の信号を加えてもよいです
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save)# django的model对象保存后,自动触发
def callback(sender,**kwargs):
print("执行post_save信号")
print(sender,kwargs)
post_save.connect(callback)
@receiver(pre_save)# django的model对象保存前,自动触发
def callback2(sender,**kwargs):
print("执行pre_save信号")
print(sender,kwargs)
pre_save.connect(callback2)
3.カスタム信号:
- PYファイル定義信号で!sig.py
import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])#toppings,size自己定义字段
__init__.py
登録信号
from sig import pizza_done
def callback(sender, **kwargs):
print("callback")
print(sender, kwargs)
pizza_done.connect(callback)
#触发后打印结果:
callback
seven {'signal': <django.dispatch.dispatcher.Signal object at 0x000001BCD6D82B38>, 'toppings': 123, 'size': 456}
トリガ信号の機能を考慮すると、それが自動的に呼び出されます、カスタム開発者のためのトリガ信号を任意の位置で必要とされるように信号は、ジャンゴに統合ビルトインによってトリガされていますので、
from django.shortcuts import render from app01 import models from sig import pizza_done def student_list(request): students = models.Student.objects.all() pizza_done.send(sender='seven', toppings=123, size=456)#给sig中定义的字段传值,发起信号者赋值 return render(request,'stu.html',{"students":students})
触发信号:单独写文件,如果在视图函数写函数,当代码取消,不方便。如果单独写函数,虽然添加信号会繁琐,但功能不需要取消时候,就方便许多。