Flask拓展(一)-- 信号
Flask框架中的信号基于blinker,安装包
pip3 install blinker
一、内置信号
from flask import signals # 内置信号
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在其中添加数据时,自动触发
信号执行顺序
# 第一步
app.__call__
# 第二步
app.wsgi_app
# 第三步
app.before_first_request
# 触发请求开始信号
signals.request_started
app.before_request
模板渲染
# 渲染前信号
before_render_template.send(app,template=template,context=context)
# 渲染模板
rv = template_render(context)
# 渲染后信号
template_rendered.send(app,template=template,context=context)
app.after_request
session.save_session()
# 触发信号
signals.request_finished
如果上述出现错误
# 触发错误处理信号
got_request_exception.send(self,exception=e)
# 返回信息
response
# 触发信号
signals.request_tearing_down
app.teardown_request
from flask import Flask,signals,template_rendered,session app = Flask(__name__) def func(*args,**kwargs): print("触发信号",args,kwargs) # 往信号中注册信号函数 signals.request_started.connect(func) # 触发信号 signals.request_started.send() @app.before_request def berfore(*args,**kwargs): print("...") @app.route('/') def index(): print("index函数") return 'index' if __name__ == '__main__': app.run()
#!/usr/bin/env python # -*- coding:utf-8 -*- from flask import Flask, current_app, flash, render_template from flask.signals import _signals app = Flask(import_name=__name__) # 自定义信号 xxxxx = _signals.signal('xxxxx') def func(sender, *args, **kwargs): print(sender) # 自定义信号中注册函数 xxxxx.connect(func) @app.route("/x") def index(): # 触发信号 xxxxx.send('123123', k1='v1') return 'Index' if __name__ == '__main__': app.run()

浙公网安备 33010602011771号