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的Django框架中的templates设置
May 11 Python
Python实现新浪博客备份的方法
Apr 27 Python
使用Pyinstaller的最新踩坑实战记录
Nov 08 Python
pandas dataframe添加表格框线输出的方法
Feb 08 Python
对Python协程之异步同步的区别详解
Feb 19 Python
WxPython建立批量录入框窗口
Feb 27 Python
python join方法使用详解
Jul 30 Python
python自动化UI工具发送QQ消息的实例
Aug 27 Python
python 字段拆分详解
Dec 17 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
Jun 02 Python
Python字符串函数strip()原理及用法详解
Jul 23 Python
基于Python的图像阈值化分割(迭代法)
Nov 20 Python
你喜欢篮球吗?Python实现篮球游戏
教你使用TensorFlow2识别验证码
Jun 11 #Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Python3中PyQt5简单实现文件打开及保存
Jun 10 #Python
Python selenium的这三种等待方式一定要会!
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
You might like
从Web查询数据库之PHP与MySQL篇
2009/09/25 PHP
php调用c接口无错版介绍
2014/03/11 PHP
yii操作cookie实例简介
2014/07/09 PHP
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
yii框架数据库关联查询操作示例
2019/10/14 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
javascript 数组的方法集合
2008/06/05 Javascript
Extjs学习笔记之一 初识Extjs之MessageBox
2010/01/07 Javascript
编写Js代码要注意的几条规则
2010/09/10 Javascript
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
微信小程序实现动态设置页面标题的方法【附源码下载】
2017/11/29 Javascript
p5.js实现斐波那契螺旋的示例代码
2018/03/22 Javascript
vue实现一个炫酷的日历组件
2018/10/08 Javascript
Electron 如何调用本地模块的方法
2019/02/01 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
[44:47]Ti4 循环赛第三日 iG vs NaVi
2014/07/12 DOTA
初步讲解Python中的元组概念
2015/05/21 Python
结合Python的SimpleHTTPServer源码来解析socket通信
2016/06/27 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
使用python实现对元素的长截图功能
2019/11/14 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
如何利用Python识别图片中的文字
2020/05/31 Python
jupyter notebook更换皮肤主题的实现
2021/01/07 Python
python3中celery异步框架简单使用+守护进程方式启动
2021/01/20 Python
CSS3中媒体查询结合rem布局适配手机屏幕
2019/06/10 HTML / CSS
CSS3制作3D立方体loading特效
2020/11/09 HTML / CSS
浅析border-radius如何兼容IE
2016/04/19 HTML / CSS
美国在线咖啡、茶和餐厅供应商:LollicupStore
2018/05/04 全球购物
销售人员自我评价怎么写
2013/09/19 职场文书
试用期转正鉴定评语
2014/01/27 职场文书
教师岗位职责范本
2015/04/02 职场文书
团组织推荐意见
2015/06/05 职场文书