什么是信号?
Django 提供一个 "信号分发器", 允许解耦的应用在框架的其它地方发生操作时会被通知到.
也就是说在特定事件发生时, 可以发送一个信号去通知注册了这个信号的一个或者多个回调, 在回调里进行逻辑处理.
Django 信号
Django 中提供了 "信号调度", 用于在框架执行操作时解耦. 通俗来讲, 就是一些动作发生的时候, 信号允许特定的发送者去提醒一些接受者.
1,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 # 创建数据库连接时, 自动触发
2, 使用
/ 项目目录下的__init__.py
- from django.db.models import signals
- # 1. 编写信号业务逻辑
- def pre_signal(*args, **kwargs):
- print('来车了, 服务了', args, kwargs)
- def post_signal(*args, **kwargs):
- print('来走了 1,', args, kwargs)
- # 2. 注册信号
- signals.pre_save.connect(pre_signal)
- signals.post_save.connect(post_signal)
/ 视图函数中
- # 3. 触发信号
- def func1(request):
- print('func1 前')
- models.User.objects.create(title='alex')
- print('func1 后')
- return HttpResponse('ojbk')
Flask 信号
Flask 内置信号
- template_rendered = _signals.signal('template-rendered')
- before_render_template = _signals.signal('before-render-template')
- request_started = _signals.signal('request-started')
- request_finished = _signals.signal('request-finished')
- request_tearing_down = _signals.signal('request-tearing-down')
- got_request_exception = _signals.signal('got-request-exception')
- appcontext_tearing_down = _signals.signal('appcontext-tearing-down')
- appcontext_pushed = _signals.signal('appcontext-pushed')
- appcontext_popped = _signals.signal('appcontext-popped')
- message_flashed = _signals.signal('message-flashed')
使用
安装: pip3 install blinker
/App.py
- from flask import Flask
- from flask import signals
- App = Flask(__name__)
- # 1 定义业务逻辑
- def pre_request(*args):
- print('车来了', args)
- # 2 注册信号
- signals.request_started.connect(pre_request)
- @App.route('/index')
- def index():
- print('函数中')
- return 'index'
- if __name__ == '__main__':
- App.run()
来源: http://www.bubuko.com/infodetail-3039014.html