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用Pillow(PIL)进行简单的图像操作方法
Jul 07 Python
深入flask之异步非堵塞实现代码示例
Jul 31 Python
python中退出多层循环的方法
Nov 27 Python
PyQt5 对图片进行缩放的实例
Jun 18 Python
Python3 使用selenium插件爬取苏宁商家联系电话
Dec 23 Python
Python基础之变量基本用法与进阶详解
Jan 03 Python
python mysql 字段与关键字冲突的解决方式
Mar 02 Python
PyQt5 如何让界面和逻辑分离的方法
Mar 24 Python
vue.js刷新当前页面的实例讲解
Dec 29 Python
python 模块重载的五种方法
Apr 24 Python
安装pytorch时报sslerror错误的解决方案
May 17 Python
python实现会员信息管理系统(List)
Mar 18 Python
你喜欢篮球吗?Python实现篮球游戏
教你使用TensorFlow2识别验证码
Jun 11 #Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Python3中PyQt5简单实现文件打开及保存
Jun 10 #Python
Python selenium的这三种等待方式一定要会!
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
You might like
zf框架的zend_cache缓存使用方法(zend框架)
2014/03/14 PHP
PHP5.5和之前的版本empty函数的不同之处
2014/06/13 PHP
PHP rsa加密解密使用方法
2015/04/27 PHP
php传值方式和ajax的验证功能
2017/03/27 PHP
TinyMCE 新增本地图片上传功能
2010/11/05 Javascript
无阻塞加载脚本分析[全]
2011/01/20 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
javascript获得当前的信息的一些常用命令
2015/02/25 Javascript
浅谈类似于(function(){}).call()的js语句
2015/03/30 Javascript
AngularJS的表单使用详解
2015/06/17 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
2015/10/27 Javascript
详解 javascript中offsetleft属性的用法
2015/11/11 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
2017/04/11 Javascript
微信小程序中显示html格式内容的方法
2017/04/25 Javascript
vue中设置、获取、删除cookie的方法
2018/09/21 Javascript
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
微信小程序动态显示项目倒计时
2019/06/20 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
vue-router重写push方法,解决相同路径跳转报错问题
2020/08/07 Javascript
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
python实现kNN算法
2017/12/20 Python
PyCharm使用之配置SSH Interpreter的方法步骤
2019/12/26 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
python是怎么被发明的
2020/06/15 Python
使用html5+css3来实现slider切换效果告别javascript+css
2013/01/08 HTML / CSS
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
Meli Melo官网:名媛们钟爱的英国奢侈手包品牌
2017/04/17 全球购物
Gap加拿大官网:Gap Canada
2017/08/24 全球购物
Expedia西班牙:预订酒店、机票、旅行和廉价度假套餐
2019/04/10 全球购物
盛大笔试题
2016/11/05 面试题
中国央视网签名寄语
2014/01/18 职场文书
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
抖音短视频(douyin)去水印工具的实现代码
2021/03/30 Javascript
深入理解Vue的数据响应式
2021/05/15 Vue.js
Python使用pandas导入xlsx格式的excel文件内容操作代码
2022/12/24 Python