Flask扩展点总结(信号)
信号(源码)
信号,是在flask框架中为我们预留的钩子,让我们可以进行一些自定义操作。
pip3 install blinker
根据flask项目的请求流程来进行设置扩展点
1.中间件
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/index')
def index():
return render_template('index.html')
@app.route('/order')
def order():
return render_template('order.html')
class MyMiddleware(object):
def __init__(self,old_app):
self.wsgi_app = old_app.wsgi_app
def __call__(self, *args, **kwargs):
print('123')
result = self.wsgi_app(*args, **kwargs)
print('456')
return result
app.wsgi_app = MyMiddleware(app)
if __name__ == '__main__':
app.run()
2.当app_ctx被push到local中栈之后,会触发appcontext_pushed信号,之前注册在这个信号中的方法,就会被执行。
from flask import Flask,render_template
from flask import signals
app = Flask(__name__)
@signals.appcontext_pushed.connect
def f1(arg):
print('appcontext_pushed信号f1被触发',arg)
@signals.appcontext_pushed.connect
def f2(arg):
print('appcontext_pushed信号f2被触发',arg)
@app.route('/index')
def index():
return render_template('index.html')
@app.route('/order')
def order():
return render_template('order.html')
if __name__ == '__main__':
app.run()
# app.__call__
3.执行before_first_request扩展
from flask import Flask,render_template
app = Flask(__name__)
@app.before_first_request
def f2():
print('before_first_requestf2被触发')
@app.route('/index')
def index():
return render_template('index.html')
@app.route('/order')
def order():
return render_template('order.html')
if __name__ == '__main__':
app.run()
4.request_started信号
from flask import Flask,render_template
from flask import signals
app = Flask(__name__)
@signals.request_started.connect
def f3(arg):
print('request_started信号被触发',arg)
@app.route('/index')
def index():
return render_template('index.html')
@app.route('/order')
def order():
return render_template('order.html')
if __name__ == '__main__':
app.run()
5.url_value_processor
from flask import Flask,render_template,g
from flask import signals
app = Flask(__name__)
@app.url_value_preprocessor
def f5(endpoint,args):
print('f5')
@app.route('/index/')
def index():
print('index')
return render_template('index.html')
@app.route('/order')
def order():
print('order')
return render_template('order.html')
if __name__ == '__main__':
app.run()
6.before_reuqest
from flask import Flask,render_template,g
from flask import signals
app = Flask(__name__)
@app.before_request
def f6():
g.xx = 123
print('f6')
@app.route('/index/')
def index():
print('index')
return render_template('index.html')
@app.route('/order')
def order():
print('order')
return render_template('order.html')
if __name__ == '__main__':
app.run()
视图函数
7.before_render_template / rendered_template
from flask import Flask,render_template,g
from flask import signals
app = Flask(__name__)
@signals.before_render_template.connect
def f7(app, template, context):
print('f7')
@signals.template_rendered.connect
def f8(app, template, context):
print('f8')
@app.route('/index/')
def index():
return render_template('index.html')
@app.route('/order')
def order():
print('order')
return render_template('order.html')
if __name__ == '__main__':
app.run()
8.after_request
from flask import Flask,render_template,g
from flask import signals
app = Flask(__name__)
@app.after_request
def f9(response):
print('f9')
return response
@app.route('/index/')
def index():
return render_template('index.html')
@app.route('/order')
def order():
print('order')
return render_template('order.html')
if __name__ == '__main__':
app.run()
9.request_finished
from flask import Flask,render_template,g
from flask import signals
app = Flask(__name__)
@signals.request_finished.connect
def f10(app,response):
print('f10')
@app.route('/index/')
def index():
return render_template('index.html')
@app.route('/order')
def order():
print('order')
return render_template('order.html')
if __name__ == '__main__':
app.run()
10.got_request_exception
from flask import Flask,render_template,g
from flask import signals
app = Flask(__name__)
@app.before_first_request
def test():
int('asdf')
@signals.got_request_exception.connect
def f11(app,exception):
print('f11')
@app.route('/index/')
def index():
return render_template('index.html')
@app.route('/order')
def order():
print('order')
return render_template('order.html')
if __name__ == '__main__':
app.run()
11.teardown_request
from flask import Flask,render_template,g
from flask import signals
app = Flask(__name__)
@app.teardown_request
def f12(exc):
print('f12')
@app.route('/index/')
def index():
return render_template('index.html')
@app.route('/order')
def order():
print('order')
return render_template('order.html')
if __name__ == '__main__':
app.run()
12.request_tearing_down
from flask import Flask,render_template,g
from flask import signals
app = Flask(__name__)
@signals.request_tearing_down.connect
def f13(app,exc):
print('f13')
@app.route('/index/')
def index():
return render_template('index.html')
@app.route('/order')
def order():
print('order')
return render_template('order.html')
if __name__ == '__main__':
app.run()
13.appcontext_popped
from flask import Flask,render_template,g
from flask import signals
app = Flask(__name__)
@signals.appcontext_popped.connect
def f14(app):
print('f14')
@app.route('/index/')
def index():
return render_template('index.html')
@app.route('/order')
def order():
print('order')
return render_template('order.html')
if __name__ == '__main__':
app.run()
总结:关于flask内部共有14+个扩展点用于我们对flask框架内部进行定制,其中有:9个是信号。
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")
Flask扩展点总结(信号)的更多相关文章
- Inside Flask - flask 扩展加载过程
Inside Flask - flask 扩展加载过程 flask 扩展(插件)通常是以 flask_<扩展名字> 为扩展的 python 包名,而使用时,可用 import flask. ...
- Flask從入門到入土(二)——請求响应與Flask扩展
———————————————————————————————————————————————————————————— 一.程序和請求上下文 Flask從客戶端收到請求時,要讓視圖函數能訪問一些對象 ...
- Flask 扩展 自定义扩展
创建一个为视图访问加日志的扩展Flask-Logging,并从中了解到写Flask扩展的规范. 创建工程 先创建一个工程,目录结构如下: flask-logging/ ├ LICENSE # 授权说明 ...
- 补充的flask实例化参数以及信号
一.实例化补充 instance_path和instance_relative_config是配合来用的.这两个参数是用来找配置文件的,当用app.config.from_pyfile('settin ...
- Flask从入门到精通之flask扩展
Flask被设计成可扩展形式,因此并没有提供一些重要的功能,比如数据库和用户认证,所以开发者可以自由选择最适合程序的包,或者按需求自行开发.社区成员开发了大量不同用途的扩展,如果这还不能满足需求,你还 ...
- Flask系列(六)Flask实例化补充及信号
一.实例化补充 instance_path和instance_relative_config是配合来用的. 这两个参数是用来找配置文件的,当用app.config.from_pyfile('setti ...
- flask实例化参数以及信号
一.实例化补充 instance_path和instance_relative_config是配合来用的.这两个参数是用来找配置文件的,当用app.config.from_pyfile('settin ...
- Flask扩展实现HTTP令牌token认证HTTPTokenAuth
Token认证 在restful设计中,用户认证模式通常使用json web token,而不会使用传统的HTTP Basic认证(传入账号密码) token认证模式如下:在请求header中加入to ...
- 2.6、Flask扩展
Flask 被设计为可扩展形式,故而没有提供一些重要的功能,例如数据库和用户认证,所以开发者可以自由选择最适合程序的包,或者按需求自行开发. 社区成员开发了大量不同用途的扩展,如果这还不能满足需求,你 ...
随机推荐
- Python之复制列表
将一个列表的数据复制到另外一个列表中. 1 a = [1,2,3] #定义列表a 2 3 b = a[:] #将列表a的切片赋值给b,也可以理解为将b的值设置为a[:] 4 5 print(a) #打 ...
- Java基础-方法的重写和重载
重载(Overload)和重写(Override) 重载是在同一个类里面,方法名字相同,而参数不同.返回类型可以相同也可以不同.每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表. 重写 ...
- Tensorflow环境配置&安装
Tensorflow环境配置&安装 明知故犯,是不想有遗憾. 背景:Tensorflow 环境配置和安装. 一.安装 Anaconda 二.建立.激活.安装.验证.使用 Tensorflow ...
- 去掉关闭按钮同时禁用alt+f4进行关闭
public int ctype = 0; private const int GWL_STYLE = -16; private const int WS_SYSMENU = 0x80000; [Sy ...
- easyui模板页面 不良调查
<%@page import="com.xy.cc.util.CUtil" %><%@page import="com.xy.cc.bean.UserP ...
- java集合大总结
Java集合大总结 java集合框架简图(API关系图): 虚线框表示接口,实线框表示类. 特点和使用总结: Collection: 单列单值. List: 有序(查询顺序和插入顺序一致),有下标(索 ...
- [LeetCode]313. Super Ugly Number超级丑数,丑数系列看这一道就行了
丑数系列的题看这一道就可以了 /* 和ugly number2差不多,不过这次的质因子多了,所以用数组来表示质因子的target坐标 target坐标指的是这个质因子此次要乘的前任丑数是谁 */ pu ...
- Android ADB原理及常用命令
Android调试桥(ADB, Android Debug Bridge)是一个Android命令行工具,包含在SDK 平台工具包中,adb可以用于连接Android设备,或者模拟器,实现对设备的控制 ...
- 一台PC端安装多店仓信息的删除
如图所示,安装了多店仓,想要删除其中莫一店仓信息! 步骤一:先找到对应目录,一般默认的目录为C:\Users\xxxx\AppData\Roaming\WebPos2.0\bosnatweiniman ...
- Linux系统性能排查
一.性能监控Sar命令 语法格式: [root@cdh init.d]# sar -h -A:所有报告的总和 -b:显示I/O和传递速率的统计信息 -B:显示换页状态 -d:输出每一块磁盘的使用信息 ...