flask信号
信号
Flask框架
中的信号基于第三方模块,其主要就是让开发者可是在flask
请求过程中定制一些用户行为 ,flask 和django都有信号
安装模块
blinker(安装这个模块 pip install blinker)
使用场景
# 比如:用户表新增一条记录,就记录一下日志
-方案一:在每个增加后,都写一行代码 ---》后期要删除,比较麻烦
-方案二:使用信号,写一个函数,绑定内置信号,只要程序执行到这,就会执行这个函数
flask 中的内置信号
# 内置信号: flask少一些,django多一些
request_started = _signals.signal('request-started') # 请求到来前执行
request_finished = _signals.signal('request-finished') # 请求结束后执行
before_render_template = _signals.signal('before-render-template') # 模板渲染前执行
template_rendered = _signals.signal('template-rendered') # 模板渲染后执行
got_request_exception = _signals.signal('got-request-exception') # 请求执行出现异常时执行
request_tearing_down = _signals.signal('request-tearing-down') # 请求执行完毕后自动执行(无论成功与否)
appcontext_tearing_down = _signals.signal('appcontext-tearing-down')# 应用上下文执行完毕后自动执行(无论成功与否)
appcontext_pushed = _signals.signal('appcontext-pushed') # 应用上下文push时执行
appcontext_popped = _signals.signal('appcontext-popped') # 应用上下文pop时执行
message_flashed = _signals.signal('message-flashed') # 调用flask在其中添加数据时,自动触发
使用内置信号的步骤
1.写一个函数
2.绑定内置信号
3.等待触发
from flask import Flask, render_template,session
from flask import signals
from flask.signals import _signals
app = Flask(__name__)
app.secret_key ='sadasd2q1'
# 1.写个函数
def test(*args, **kwargs):
print(args, kwargs)
print('我执行了')
# 2.信号绑定
signals.before_render_template.connect(test)
# 3.等待信号触发
@app.route('/')
def index():
return render_template('user.html')
if __name__ == '__main__':
app.run()
自定义信号使用步骤
from flask import Flask, render_template,session
from flask import signals
from flask.signals import _signals
app = Flask(__name__)
app.secret_key ='sadasd2q1'
# 自定义信号
# 1.定义信号
session_set = _signals.signal('session_set') # session_set 信号名
# 2.写一个函数
def test(*args, **kwargs):
print(args, kwargs)
print('我执行了')
# 3.信号绑定
session_set.connect(test)
# 4 自己触发信号
@app.route('/')
def hello_word():
session['lxj'] = 18
session_set.send() # 信号名.set 触发信号执行
return 'hello world'
@app.route('/index')
def index():
return render_template('user.html')
if __name__ == '__main__':
app.run()
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 # 请求异常后,自动触发
Database Wrappers # 数据库
connection_created # 创建数据库连接时,自动触发
# django中使用内置信号
1.写一个函数
def callBack(*args, **kwargs):
print(args)
print(kwargs)
2.绑定信号
# 方式一
post_save.connect(callBack)
# 方式二
formfrom django.db.models.signals import pre_save
from django.dispatch import receiver
@receiver(pre_save)
def my_callback(sender, **kwargs):
print("对象创建成功")
print(sender)
print(kwargs)
3.等待触发
django信号使用详细文档