08 Flask源码剖析之flask拓展点
08 Flask源码剖析之flask拓展点
1. 信号(源码)
信号,是在flask框架中为我们预留的钩子,让我们可以进行一些自定义操作。
pip3 install blinker
2. 根据flask项目的请求流程来进行设置扩展点
中间件
# 代码示例 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()
当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__执行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()
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()
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()
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()
视图函数
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()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()
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()
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()
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()
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()
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()扩展:flash
flash存值之后只能取一次
# 代码示例 from flask import Flask,render_template,flash,get_flashed_messages,session
from flask import signals
app = Flask(__name__)
app.secret_key = 'iuknsoiuwknlskjdf' @app.route('/index/')
def index():
# flash('123')
session['k1'] = 123
return render_template('index.html') @app.route('/order')
def order():
# messages = get_flashed_messages()
# print(messages)
val = session['k1']
del session['k1']
print(val)
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")
08 Flask源码剖析之flask拓展点的更多相关文章
- 02 flask源码剖析之flask快速使用
02 flask快速使用 目录 02 flask快速使用 1.flask与django的区别 2. 安装 3. 依赖wsgi Werkzeug 4. 快速使用flask 5. 用户登录&用户管 ...
- flask源码剖析系列(系列目录)
flask源码剖析系列(系列目录) 01 flask源码剖析之werkzurg 了解wsgi 02 flask源码剖析之flask快速使用 03 flask源码剖析之threading.local和高 ...
- flask 源码剖析
flask 上下文管理源码流程及涉及的部分技术点 [flask源码梳理]之一 偏函数_mro [flask源码梳理]之二 面向对象中__setattr__ [flask源码梳理]之三 Local ...
- 08 jwt源码剖析
08 jwt源码剖析 目录 08 jwt源码剖析 1. jwt认证流程 2.jwt创建token 2.1 原理 2.2 jwt校验token 3. jwt使用 4. 源码剖析 总结: JSON Web ...
- Flask源码剖析详解
1. 前言 本文将基于flask 0.1版本(git checkout 8605cc3)来分析flask的实现,试图理清flask中的一些概念,加深读者对flask的理解,提高对flask的认识.从而 ...
- 04 flask源码剖析之LocalStack和Local对象实现栈的管理
04 LocalStack和Local对象实现栈的管理 目录 04 LocalStack和Local对象实现栈的管理 1.源码入口 1. flask源码关于local的实现 2. flask源码关于l ...
- 05 flask源码剖析之配置加载
05 Flask源码之:配置加载 目录 05 Flask源码之:配置加载 1.加载配置文件 2.app.config源码分析 3.from_object源码分析 4. 总结 1.加载配置文件 from ...
- 06 flask源码剖析之路由加载
06 Flask源码之:路由加载 目录 06 Flask源码之:路由加载 1.示例代码 2.路由加载源码分析 1.示例代码 from flask import Flask app = Flask(__ ...
- 07 flask源码剖析之用户请求过来流程
07 Flask源码之:用户请求过来流程 目录 07 Flask源码之:用户请求过来流程 1.创建ctx = RequestContext对象 2. 创建app_ctx = AppContext对象 ...
随机推荐
- ArchLinux——使用WINE-TIM头像异常解决办法
ArchLinux--使用WINE-TIM头像异常解决办法 当使用WINE-TIM头像图片加载异常时,执行以下命令 sudo sysctl -w net.ipv6.conf.all.disable_i ...
- [转] 间接系统调用syscall(SYS_gettid)
点击阅读原文 在linux下每一个进程都一个进程id,类型pid_t,可以由 getpid()获取. POSIX线程也有线程id,类型pthread_t,可以由 pthread_self()获取,线程 ...
- Mariadb 10.14 mysqldump error: 1049
Mariadb 10.14 mysqldump error: 1049 Table of Contents 1. 错误信息 2. 解决方法 1 错误信息 执行表导出: mysqldump -uroot ...
- [每日一题2020.06.12]P3375 【模板】KMP字符串匹配
题目链接 关于kmp : https://www.cnblogs.com/roccoshi/p/13096988.html 关于kmp, 想了很久, 我觉得不应该放在这里写, 另开一贴记录一下. #i ...
- vue事件修饰符与按钮修饰符
事件修饰符:(当事件无需传参数时可直接写成以下形式,有参数时则为@click.stop="handleLiClick($event)") stop:阻止事件冒泡行为(子元素被点击, ...
- Eclipse设置断点无效、无法拦截请求进行Debug调试
场景: 在Eclipse中添加Debug断点,从后台页面中点击修改按钮提交数据,发现打断点的地方并没有拦截到请求,接下来对此情况的进行分析. 分析: * 如果页面是根据业务需求复制别的相似html页面 ...
- 我们是如何做go语言系统测试覆盖率收集的?
工程效能领域,测试覆盖率度量总是绕不开的话题,我们也不例外.在七牛云,我们主要使用go语言构建云服务,在考虑系统测试覆盖率时,最早也是通过围绕原生go test -c -cover的能力来构建.这个方 ...
- Perl入门(一)Perl的基本类型及运算符
在学习Perl的基础之前,还是希望大家有空去看以下Perl的简介.百度百科 一.Perl的基本类型 Per的基本类型分为两种:数值型和字符串型. 数值型可细分为 整数型.如123. 浮点型.如123. ...
- android屏幕适配的全攻略3-动态获取手机屏幕宽高及动态设置控件宽高
1.获取手机屏幕宽高: DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetr ...
- 入门大数据---ClouderaManager和CDH是什么?
1.CDH概述 CDH(Cloudra's Distribution Apache Of Hadoop)是Apache Hadoop和相关项目的最完整,经过测试和最流行的发行版.CDH提供Hadoop ...