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 open()文件处理使用介绍
Nov 30 Python
python3实现ftp服务功能(客户端)
Mar 24 Python
python放大图片和画方格实现算法
Mar 30 Python
PYTHON基础-时间日期处理小结
May 05 Python
python实现批量修改图片格式和尺寸
Jun 07 Python
树莓派与PC端在局域网内运用python实现即时通讯
Jun 22 Python
python模拟键盘输入 切换键盘布局过程解析
Aug 15 Python
django在保存图像的同时压缩图像示例代码详解
Feb 11 Python
django使用JWT保存用户登录信息
Apr 22 Python
使用python实现名片管理系统
Jun 18 Python
matplotlib自定义鼠标光标坐标格式的实现
Jan 08 Python
python 获取域名到期时间的方法步骤
Feb 10 Python
你喜欢篮球吗?Python实现篮球游戏
教你使用TensorFlow2识别验证码
Jun 11 #Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Python3中PyQt5简单实现文件打开及保存
Jun 10 #Python
Python selenium的这三种等待方式一定要会!
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
You might like
PHP 文件上传全攻略
2010/04/28 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
php文件读取方法实例分析
2015/06/20 PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
2016/02/15 PHP
php实现登录tplink WR882N获取IP和重启的方法
2016/07/20 PHP
最近项目写了一些js,水平有待提高
2009/01/31 Javascript
Array.prototype 的泛型应用分析
2010/04/30 Javascript
对xmlHttp对象的理解
2011/01/17 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
理解JavaScript表单的基础知识
2016/01/25 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
AngularJS封装指令方法详解
2016/12/12 Javascript
Angular2使用Guard和Resolve进行验证和权限控制
2017/04/24 Javascript
seajs实现强制刷新本地缓存的方法分析
2017/10/16 Javascript
微信小程序canvas实现刮刮乐效果
2018/07/09 Javascript
Vue.js上传图片到阿里云OSS存储的方法示例
2018/12/13 Javascript
使用Three.js实现太阳系八大行星的自转公转示例代码
2019/04/09 Javascript
Javascript读取上传文件内容/类型/字节数
2019/04/30 Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
2020/05/11 Javascript
详解JavaScript匿名函数和闭包
2020/07/10 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
[40:48]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第二局
2016/02/28 DOTA
Python 搭建Web站点之Web服务器与Web框架
2016/11/06 Python
Python3 XML 获取雅虎天气的实现方法
2018/02/01 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
2019/08/09 Python
安装2019Pycharm最新版本的教程详解
2019/10/22 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
浅谈Python3多线程之间的执行顺序问题
2020/05/02 Python
基于Python实现简单学生管理系统
2020/07/24 Python
普天C++笔试题
2016/03/20 面试题
EJB发布WEB服务一般步骤
2012/10/31 面试题
《池塘边的叫声》教学反思
2014/04/12 职场文书
2014年学生会部门工作总结
2014/11/07 职场文书
村官2015年度工作总结
2015/10/14 职场文书
Python如何解决secure_filename对中文不支持问题
2021/07/16 Python