Python Flask请求扩展与中间件相关知识总结


Posted in Python onJune 11, 2021

一、请求扩展

1.before_request

作用: 类比django中间件中的process_request,在请求到来执行路由函数之前先执行. 但是如果有多个顺序是从上往下执行.

应用: 基于它做用户登录认证

注意: 如果before_request的返回值不是None的清空下, 返回的而是别的值, 那么后续的请求都不会执行,本次请求直接返回, 如果定义了after_request那么会接着它执行, 最终本次请求响应结束.

@app.before_request
def process_request(*args,**kwargs):
    if request.path == '/login':
        return None
    user = session.get('user_info')
    if user:
        return None
    return redirect('/login')

2.after_request

作用: 类比django中间件中的process_response,如果请求没有出现异常的情况下, 会在请求返回return之前执行. 但是如果有多个顺序是从下往上执行.

@app.after_request  # 后执行
def process_response1(response):
    print('process_response1 走了')
    return response

@app.after_request  # 先执行
def process_response2(response):
    print('process_response2 走了')
    return response

3.before_first_request

作用: 项目启动起来接收到第一次请求时执行.

应用: 项目初始化用来保证以后项目只要不重启就不再继续执行.

@app.before_first_request
def first():
    print('我的第一次')

4. teardown_request

作用: 在每一个路由函数执行完毕之后执行,即使遇到了异常也会执行. (提示: 返回reutrn没有任何的效果, 不能控制返回的结果)

应用: 记录日志

@app.teardown_request  
def ter(e):  # e就是上一个路由函授执行过程中出现被捕获的异常信息.
    print(e)
    print('我是teardown_request ')

5.errorhandler

作用: 绑定错误的状态码进而可以捕获服务器的错误, 并返回对应的错误页面.

@app.errorhandler(500)
def error_500(arg):
    return render_template('error.html', message='500错误')


@app.errorhandler(404)
def error_404(arg):
    return render_template('error.html', message='404错误')

6.template_global

作用: 全局的标签, 在任意的html页面中就可以直接使用, 不需要在render_template中传递参数以后才能使用.

@app.template_global()
def sb(a1, a2):
    return a1 + a2

# html页面中直接使用, 不需要传递参数.
{{ sb(1,2) }}

7.template_filter

@app.template_filter()
def db(a1, a2, a3):
    return a1 + a2 + a3

# html页面中直接使用, 不需要传递参数. 其中1传递给a1, 2传递给a2, 3传递给a3. (提示: Django中的过滤器最多只可以传递二个参数)
{{ 1|db(2,3) }}

总结:

1.重点掌握before_requestafter_request

2.注意有多个的情况,执行顺序

3.before_request请求拦截后(也就是有return值),response所有都执行

二、中间件

class Md(object):
    def __init__(self, old_wsgi_app):
        self.old_wsgi_app = old_wsgi_app

    def __call__(self, environ, start_response):
        print('开始之前')
        ret = self.old_wsgi_app(environ, start_response)
        print('结束之后')
        return ret


if __name__ == '__main__':
    # 1. 我们发现当执行app.run方法的时候,最终执行run_simple,最后执行app(),也就是在执行app.__call__方法
    # 2. 在__call__里面,执行的是self.wsgi_app().那我们希望在执行他本身的wsgi之前做点事情。
    # 3. 所以我们先用Md类中__init__,保存之前的wsgi,然后我们用将app.wsgi转化成Md的对象。
    # 4. 那执行新的的app.wsgi_app,就是执行Md的__call__方法。
    # 5. 最后把原来的wsgi_app替换为自定义的

    app.wsgi_app = Md(app.wsgi_app)
    app.run()

到此这篇关于Python Flask请求扩展与中间件相关知识总结的文章就介绍到这了,更多相关Flask请求扩展与中间件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python序列操作之进阶篇
Dec 08 Python
python 实现红包随机生成算法的简单实例
Jan 04 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
Feb 01 Python
Python安装模块的常见问题及解决方法
Feb 05 Python
python使用TensorFlow进行图像处理的方法
Feb 28 Python
Python中的pack和unpack的使用
Mar 12 Python
Python实现将json文件中向量写入Excel的方法
Mar 26 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
Oct 26 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
Jun 27 Python
python构建指数平滑预测模型示例
Nov 21 Python
python获得命令行输入的参数的两种方式
Nov 02 Python
OpenCV-Python实现图像平滑处理操作
Jun 08 Python
你喜欢篮球吗?Python实现篮球游戏
教你使用TensorFlow2识别验证码
Jun 11 #Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Python3中PyQt5简单实现文件打开及保存
Jun 10 #Python
Python selenium的这三种等待方式一定要会!
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
You might like
php数组应用之比较两个时间的相减排序
2008/08/18 PHP
php中显示数组与对象的实现代码
2011/04/18 PHP
PHP里的中文变量说明
2011/07/23 PHP
php 无法加载mcrypt.dll的解决办法
2013/04/03 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
Yii2框架实现登陆添加验证码功能示例
2018/07/12 PHP
JavaScript游戏之是男人就下100层代码打包
2010/11/08 Javascript
jquery实现图片滚动效果的简单实例
2013/11/23 Javascript
使用js完成节点的增删改复制等的操作
2014/01/02 Javascript
浅谈javascript的调试
2015/01/28 Javascript
jQuery判断元素上是否绑定了指定事件的方法
2015/03/17 Javascript
JavaScript中的toLocaleDateString()方法使用简介
2015/06/12 Javascript
基于jquery实现复选框全选,反选,全不选等功能
2015/10/16 Javascript
js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解
2015/11/09 Javascript
jQuery实现调整表格单列顺序完整实例
2016/06/20 Javascript
easyui中combotree循环获取父节点至根节点并输出路径实现方法
2016/11/10 Javascript
JS中关于事件处理函数名后面是否带括号的问题
2016/11/16 Javascript
jstree的简单实例
2016/12/01 Javascript
vue2 自定义动态组件所遇到的问题
2017/06/08 Javascript
小程序实现多列选择器
2019/02/15 Javascript
nodejs实现用户登录路由功能
2019/05/22 NodeJs
vue项目中自定义video视频控制条的实现代码
2020/04/26 Javascript
Openlayers3实现车辆轨迹回放功能
2020/09/29 Javascript
JavaScript实现随机点名小程序
2020/10/29 Javascript
python将人民币转换大写的脚本代码
2013/02/10 Python
python继承和抽象类的实现方法
2015/01/14 Python
详解Python做一个名片管理系统
2019/03/14 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
2020/07/03 Python
美国购买和销售礼品卡平台:Raise
2017/01/13 全球购物
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
为您搜罗全球潮流時尚品牌:HBX
2019/12/04 全球购物
联强国际笔试题面试题
2013/07/10 面试题
办理护照工作证明
2014/10/10 职场文书
2014年信用社工作总结
2014/11/25 职场文书
导游词之宿迁乾隆行宫
2019/10/15 职场文书
利用Python第三方库实现预测NBA比赛结果
2021/06/21 Python