django内置组件

信号

django内置信号如下:

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,update),自动触发
class_prepared    # 程序启动时,检测到已注册的model类,对于每一个类,自动触发
request_started     # 请求到来前,自动触发
request_finished    # 请求结束后,自动触发
got_request_exception           # 请求异常时,自动触发
setting_changed     # 配置文件改变时,自动触发
template_rendered   # 模板执行渲染操作时,自动触发
connection_created  # 创建数据库连接时,自动触发

内置信号使用

pre_savepost_save为例,

# 项目目录 init.py

# 1、导入需要引用的内置信号
from django.db.models.signals import pre_save, post_save 
# 2、自定义功能函数
def pre_save_func(sender, **kwargs):
    print('pre_save_fun')
    print('pre_save_msg:', sender, kwargs)

def post_save_func(sender, **kwargs):
    print('post_save_func')
    print('post_save_msg:', sender,kwargs)

# 3、绑定功能函数到信号
pre_save.connect(pre_save_func)  # 在save对象前触发
post_save.connect(post_save_func)  # 在save对象后触发

# 4、打印结果
pre_save_fun
pre_save_msg: <class 'app01.models.Author'> {'signal': <django.db.models.signals.ModelSignal object at 0x0343F990>, 'instance': <Author: kate>, 'raw': False, 'using': 'default', 'update_fields': None}
post_save_func
post_save_msg: <class 'app01.models.Author'> {'signal': <django.db.models.signals.ModelSignal object at 0x0343F9F0>, 'instance': <Author: kate>, 'created': True, 'update_fields': None, 'raw': False, 'using': 'default'}

自定义信号
1、创建文件, 定义信号:

# /utils/signal_test.py
# step1:实例化signal对象
import django.dispatch
action=django.dispatch.Signal(providing_args=["aaa","bbb"])

2、在项目应用的init文件中完成功能函数和绑定信号

# django_review\__init__.py
from utils.signal_test import action

# step2:定义receiver(A function or an instance method which is to receive signals.)
def pre_save_func(sender, **kwargs):
    print("pre_save_func")
    print("pre_save_msg:", sender, kwargs)

# step3:Connect receiver to sender for signal.
action.connect(pre_save_func)

3、在视图函数中触发信号

from utils.signal_test import action

def index(request):
    books = Book.objects.all()
    author = Author.objects.create(name='kate1',gender=1)
    
    # step4:发送信号到所有连接的reciever(Send signal from sender to all connected receivers.)
    action.send(sender='create', aaa=author.name, bbb=author.get_gender_display())
    return render(request, 'index.html', locals())

4、结果展示

pre_save_func
pre_save_msg: create {'signal': <django.dispatch.dispatcher.Signal object at 0x04287370>, 'aaa': 'kate1', 'bbb': '女'}
[09/Aug/2018 11:00:50] "GET / HTTP/1.1" 200 990

信号和中间件的区别

1、信号比中间件散布的范围更广
2、在后台的许多动作事件都可以触发内置的信号,从而执行与之绑定的函数
3、也可以自定义信号扩展其功能
4、而中间件常用的就只有四个函数,且仅在接受请求和返回请求的过程中起作用。

猜你喜欢

转载自www.cnblogs.com/fqh202/p/10202322.html