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 相关文章推荐
在Linux系统上部署Apache+Python+Django+MySQL环境
Dec 24 Python
Python自动化运维和部署项目工具Fabric使用实例
Sep 18 Python
[原创]pip和pygal的安装实例教程
Dec 07 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
Dec 10 Python
基于wxPython的GUI实现输入对话框(2)
Feb 27 Python
详解python多线程之间的同步(一)
Apr 03 Python
如何在Django项目中引入静态文件
Jul 26 Python
Python 获取numpy.array索引值的实例
Dec 06 Python
Pycharm配置PyQt5环境的教程
Apr 02 Python
python实现单机五子棋
Aug 28 Python
Django 权限管理(permissions)与用户组(group)详解
Nov 30 Python
Python爬取网站图片并保存的实现示例
Feb 26 Python
你喜欢篮球吗?Python实现篮球游戏
教你使用TensorFlow2识别验证码
Jun 11 #Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Python3中PyQt5简单实现文件打开及保存
Jun 10 #Python
Python selenium的这三种等待方式一定要会!
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
You might like
PHP的一个完整SMTP类(解决邮件服务器需要验证时的问题)
2006/10/09 PHP
PHP在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
php实现cc攻击防御和防止快速刷新页面示例
2014/02/13 PHP
PHP后台微信支付和支付宝支付开发
2017/04/28 PHP
PHP机器学习库php-ml的简单测试和使用方法
2017/07/14 PHP
PHP var关键字相关原理及使用实例解析
2020/07/11 PHP
php中get_object_vars()在数组的实例用法
2021/02/22 PHP
JS对象与json字符串格式转换实例
2014/10/28 Javascript
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
2017/10/26 Javascript
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
Java设计中的Builder模式的介绍
2018/03/22 Javascript
Vue实现导出excel表格功能
2018/03/30 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
2019/02/12 Javascript
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
微信小程序分包加载代码实现方法详解
2019/09/23 Javascript
[02:20]DOTA2英雄基础教程 黑暗贤者
2013/12/19 DOTA
[46:50]Liquid vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python基础教程之基本数据类型和变量声明介绍
2014/08/29 Python
EM算法的python实现的方法步骤
2018/01/02 Python
Python处理session的方法整理
2019/08/29 Python
Python之指数与E记法的区别详解
2019/11/21 Python
Python + Requests + Unittest接口自动化测试实例分析
2019/12/12 Python
parser.add_argument中的action使用
2020/04/20 Python
新加坡领先的在线生活方式和杂货购物网站:EAMART
2019/04/02 全球购物
阿里巴巴美国:Alibaba美国
2019/11/24 全球购物
Skyscanner香港:机票比价, 平机票和廉价航空机票预订
2020/02/07 全球购物
护理学专业求职信
2014/06/29 职场文书
《爱的教育》读书心得
2014/11/08 职场文书
2015年乡镇工作总结范文
2015/04/22 职场文书
健康教育主题班会
2015/08/14 职场文书
检举信的写法
2019/04/10 职场文书
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python
MySQL 数据类型选择原则
2021/05/27 MySQL
python Tkinter模块使用方法详解
2022/04/07 Python
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
2022/06/21 Java/Android