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文本操作相关模块
Jun 22 Python
python3解析库pyquery的深入讲解
Jun 26 Python
Python 使用PIL中的resize进行缩放的实例讲解
Aug 03 Python
使用 Python 实现微信群友统计器的思路详解
Sep 26 Python
将pip源更换到国内镜像的详细步骤
Apr 07 Python
Python使用crontab模块设置和清除定时任务操作详解
Apr 09 Python
Python 进程之间共享数据(全局变量)的方法
Jul 16 Python
python求加权平均值的实例(附纯python写法)
Aug 22 Python
wxpython布局的实现方法
Nov 01 Python
Django 解决上传文件时,request.FILES为空的问题
May 20 Python
Python判断远程服务器上Excel文件是否被人打开的方法
Jul 13 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
Sep 16 Python
你喜欢篮球吗?Python实现篮球游戏
教你使用TensorFlow2识别验证码
Jun 11 #Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Python3中PyQt5简单实现文件打开及保存
Jun 10 #Python
Python selenium的这三种等待方式一定要会!
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
You might like
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
UCenter 批量添加用户的php代码
2012/07/17 PHP
php基于mcrypt的加密解密实例
2014/10/27 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
2014/12/15 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
2019/12/13 PHP
JS类库Bindows1.3中的内存释放方式分析
2007/03/08 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
javascript判断图片是否加载完成的方法推荐
2016/05/13 Javascript
JavaScript 中有关数组对象的方法(详解)
2016/08/15 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
十大 Node.js 的 Web 框架(快速提升工作效率)
2017/06/30 Javascript
jQuery扩展_动力节点Java学院整理
2017/07/05 jQuery
JS获取url参数,JS发送json格式的POST请求方法
2018/03/29 Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
2018/05/07 Javascript
vue组件中的数据传递方法
2018/05/14 Javascript
微信小程序开发实现的IP地址查询功能示例
2019/03/28 Javascript
nodejs+express最简易的连接数据库的方法
2020/12/23 NodeJs
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
浅述python中argsort()函数的实例用法
2017/03/30 Python
python3图片文件批量重命名处理
2019/10/31 Python
基于css3实现漂亮便签样式
2013/03/18 HTML / CSS
CSS3 实现雷达扫描图的示例代码
2020/09/21 HTML / CSS
详解HTML5中的拖放事件(Drag 和 drop)
2016/11/14 HTML / CSS
SteelSeries赛睿官网:游戏外设和配件的领先制造商(耳机、键盘、鼠标和鼠标垫)
2018/06/17 全球购物
新加坡领先的在线生活方式和杂货购物网站:EAMART
2019/04/02 全球购物
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
AJax面试题
2014/11/25 面试题
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
80后婚前协议书范本
2014/10/24 职场文书
邀请函范文
2015/02/02 职场文书
高中地理教学反思
2016/02/19 职场文书
pandas 操作 Excel操作总结
2021/03/31 Python
【2·13】一图读懂中国无线电发展
2022/02/18 无线电
Vue Mint UI mt-swipe的使用方式
2022/06/05 Vue.js