Flask之信号
信号的作用
lask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为
内置信号
内置信号是flask请求过程中源码中定义的。
不需要我们定义和触发,只要写了函数跟它对应,函数执行到这,就会触发函数执行。
所有类型的信号
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在其中添加数据时,自动触发
内置信号的使用案例(在模板渲染前-记录日志)
from flask import Flask, render_template
app = Flask(__name__)
app.debug = True
# 我们现在想在模板渲染之 : 记录日志 使用内置信号实现
# 1 写一个函数
def before_render(*args, **kwargs):
print(args)
print(kwargs)
# 谁(ip) 在什么时间 访问了哪个页面(template)
print('记录日志,模板要渲染了')
# 2 跟内置信号绑定
from flask.signals import before_render_template
before_render_template.connect(before_render)
# 3 源码中触发信号执行(我们不需要动)
# before_render_template.send() 源码再模板渲染之前,它写死了
@app.route('/')
def index():
return render_template('index.html')
@app.route('/login')
def login():
return render_template('login.html')
if __name__ == '__main__':
app.run()