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操作数据库之sqlite3打开数据库、删除、修改示例
Mar 13 Python
python完成FizzBuzzWhizz问题(拉勾网面试题)示例
May 05 Python
探究python中open函数的使用
Mar 01 Python
Python中多线程的创建及基本调用方法
Jul 08 Python
Python基于PyGraphics包实现图片截取功能的方法
Dec 21 Python
python在非root权限下的安装方法
Jan 23 Python
Django中Forms的使用代码解析
Feb 10 Python
numpy找出array中的最大值,最小值实例
Apr 03 Python
wxPython的安装与使用教程
Aug 31 Python
python导入坐标点的具体操作
May 10 Python
使用pycharm和pylint检查python代码规范操作
Jun 09 Python
pytorch fine-tune 预训练的模型操作
Jun 03 Python
你喜欢篮球吗?Python实现篮球游戏
教你使用TensorFlow2识别验证码
Jun 11 #Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Python3中PyQt5简单实现文件打开及保存
Jun 10 #Python
Python selenium的这三种等待方式一定要会!
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
You might like
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
2014/10/20 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
php导入excel文件到mysql数据库的方法
2015/01/14 PHP
thinkPHP模型初始化实例分析
2015/12/03 PHP
PHP错误机制知识汇总
2016/03/24 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
用js得到网页中所有的div的id
2020/10/19 Javascript
JavaScript 学习笔记 Black.Caffeine 09.11.28
2009/11/30 Javascript
JQuery中SetTimeOut传参问题探讨
2013/05/10 Javascript
用jquery中插件dialog实现弹框效果实例代码
2013/11/15 Javascript
JS获取及设置TextArea或input文本框选择文本位置的方法
2015/03/24 Javascript
JavaScript日期对象(Date)基本用法示例
2017/01/18 Javascript
JavaScript实现打印星型金字塔功能实例分析
2017/09/27 Javascript
vue-cli项目代理proxyTable配置exclude的方法
2018/09/20 Javascript
Vue 后台管理类项目兼容IE9+的方法示例
2019/02/20 Javascript
解析vue、angular深度作用选择器
2019/09/11 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
2020/01/21 Javascript
深入了解Vue3模板编译原理
2020/11/19 Vue.js
Python中的Django基本命令实例详解
2018/07/15 Python
python 实现对文件夹中的图像连续重命名方法
2018/10/25 Python
python在回调函数中获取返回值的方法
2019/02/22 Python
python lambda函数及三个常用的高阶函数
2020/02/05 Python
windows下的pycharm安装及其设置中文菜单
2020/04/23 Python
python基本算法之实现归并排序(Merge sort)
2020/09/01 Python
HTML5操作WebSQL数据库的实例代码
2017/08/26 HTML / CSS
巴基斯坦电子产品购物网站:Home Shopping
2017/09/14 全球购物
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
最新党员思想汇报
2014/01/01 职场文书
销售行政专员职责
2014/01/03 职场文书
加工操作管理制度
2014/01/19 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers
SpringBoot项目中控制台日志的保存配置操作
2021/06/18 Java/Android
vue3获取当前路由地址
2022/02/18 Vue.js
十大动画制作软件,Adobe产品上榜两款,第一是行业标准软件
2022/03/18 杂记
sentinel支持的redis高可用集群配置详解
2022/04/01 Redis
Typescript类型系统FLOW静态检查基本规范
2022/05/25 Javascript