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 相关文章推荐
在Django中编写模版节点及注册标签的方法
Jul 20 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
Apr 28 Python
Python 查看文件的读写权限方法
Jan 23 Python
python自动12306抢票软件实现代码
Feb 24 Python
python+selenium实现自动抢票功能实例代码
Nov 23 Python
python采集微信公众号文章
Dec 20 Python
python实现控制台打印的方法
Jan 12 Python
简单了解python调用其他脚本方法实例
Mar 26 Python
Python中zip函数如何使用
Jun 04 Python
Python中logging日志记录到文件及自动分割的操作代码
Aug 05 Python
深入理解Python变量的数据类型和存储
Feb 01 Python
如何使用Python对NetCDF数据做空间相关分析
Apr 21 Python
你喜欢篮球吗?Python实现篮球游戏
教你使用TensorFlow2识别验证码
Jun 11 #Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Python3中PyQt5简单实现文件打开及保存
Jun 10 #Python
Python selenium的这三种等待方式一定要会!
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
You might like
如何在PHP中进行身份认证
2006/10/09 PHP
PHP 基本语法格式
2009/12/15 PHP
在PHP中检查PHP文件是否有语法错误的方法
2009/12/23 PHP
PHP连接MongoDB示例代码
2012/09/06 PHP
php mysql实现mysql_select_db选择数据库
2016/12/30 PHP
PHP实现判断数组是一维、二维或几维的方法
2017/02/06 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
2019/10/16 PHP
JavaScript网页制作特殊效果用随机数
2007/05/22 Javascript
理解Javascript_15_作用域分配与变量访问规则,再送个闭包
2010/10/20 Javascript
Javascript 类型转换方法
2010/10/24 Javascript
Jquery全屏相册插件zoomvisualizer具有调节放大与缩小功能
2015/11/02 Javascript
jQuery Chosen通用初始化
2017/03/07 Javascript
jQuery手风琴的简单制作
2017/05/12 jQuery
JS实现点击Radio动态更新table数据
2017/07/18 Javascript
prototype.js简单实现ajax功能示例
2017/10/18 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
node.JS二进制操作模块buffer对象使用方法详解
2020/02/06 Javascript
JS通用方法触发点击事件代码实例
2020/02/17 Javascript
深入理解Antd-Select组件的用法
2020/02/25 Javascript
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
matplotlib subplots 设置总图的标题方法
2018/05/25 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
2020/11/09 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
2021/02/02 Python
详解Django中的FBV和CBV对比分析
2021/03/01 Python
Oakley官网:运动太阳镜、雪镜和服装
2016/09/30 全球购物
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
数据库专业英语
2012/11/30 面试题
学籍证明模板
2014/11/21 职场文书
工程质量保证书
2015/05/09 职场文书
创业计划书介绍
2019/04/24 职场文书
MySQL 分组查询的优化方法
2021/05/12 MySQL
python中取整数的几种方法
2021/11/07 Python
MySQL中B树索引和B+树索引的区别详解
2022/03/03 MySQL