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 del()函数用法
Mar 24 Python
python文件和目录操作方法大全(含实例)
Mar 12 Python
Python中处理字符串的相关的len()方法的使用简介
May 19 Python
通过数据库向Django模型添加字段的示例
Jul 21 Python
浅谈python抛出异常、自定义异常, 传递异常
Jun 20 Python
python制作企业邮箱的爆破脚本
Oct 05 Python
Python实现查看系统启动项功能示例
May 10 Python
使用python读取csv文件快速插入数据库的实例
Jun 21 Python
libreoffice python 操作word及excel文档的方法
Jul 04 Python
python中time库的实例使用方法
Oct 31 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 Python
Python基础之Socket通信原理
Apr 22 Python
你喜欢篮球吗?Python实现篮球游戏
教你使用TensorFlow2识别验证码
Jun 11 #Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Python3中PyQt5简单实现文件打开及保存
Jun 10 #Python
Python selenium的这三种等待方式一定要会!
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
You might like
php chr() ord()中文截取乱码问题解决方法
2008/09/08 PHP
PHP MemCached高级缓存配置图文教程
2010/08/05 PHP
php curl选项列表(超详细)
2013/07/01 PHP
php中使用gd库实现远程图片下载实例
2015/05/12 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
PHP+RabbitMQ实现消息队列的完整代码
2019/03/20 PHP
Jquery下判断Id是否存在的代码
2011/01/06 Javascript
js分解url参数(面向对象-极简主义法应用)
2012/08/09 Javascript
JavaScript定时显示广告代码分享
2015/03/02 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
2016/01/06 Javascript
AngularJS中过滤器的使用与自定义实例代码
2016/09/17 Javascript
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
微信小程序位置授权处理方法
2019/06/13 Javascript
vue实现倒计时获取验证码效果
2020/04/17 Javascript
python实现对一个完整url进行分割的方法
2015/04/29 Python
python bmp转换为jpg 并删除原图的方法
2018/10/25 Python
Python中is和==的区别详解
2018/11/15 Python
selenium+python自动化测试之页面元素定位
2019/01/23 Python
详解python编译器和解释器的区别
2019/06/24 Python
使用celery和Django处理异步任务的流程分析
2020/02/19 Python
Python 线性回归分析以及评价指标详解
2020/04/02 Python
python3 使用openpyxl将mysql数据写入xlsx的操作
2020/05/15 Python
python实现简单的tcp 文件下载
2020/09/16 Python
Sofft鞋官网:世界知名鞋类品牌
2017/03/28 全球购物
美国最灵活的移动提供商:Tello
2017/07/18 全球购物
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
意大利灯具购物网站:Lampade.it
2018/10/18 全球购物
Tommy Hilfiger美国官网:美国高端休闲领导品牌
2019/01/14 全球购物
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的
2015/07/24 面试题
如何用Java实现列出某个目录下的所有子目录
2015/07/20 面试题
电脑销售顾问自荐信
2014/01/29 职场文书
设备动力科岗位职责范本
2014/02/23 职场文书
新闻人物通讯稿
2014/10/09 职场文书
安全教育主题班会教案
2015/08/12 职场文书
Python虚拟环境virtualenv是如何使用的
2021/06/20 Python
业余无线电通联Q语
2022/02/18 无线电