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的一些用法分享
Oct 07 Python
python实现从一组颜色中找出与给定颜色最接近颜色的方法
Mar 19 Python
KMP算法精解及其Python版的代码示例
Jun 01 Python
python 队列详解及实例代码
Oct 18 Python
Python学习之用pygal画世界地图实例
Dec 07 Python
手把手教你python实现SVM算法
Dec 27 Python
Python 2.7中文显示与处理方法
Jul 16 Python
Python运行不显示DOS窗口的解决方法
Oct 22 Python
python解析含有重复key的json方法
Jan 22 Python
Python变量类型知识点总结
Feb 18 Python
Pytorch中实现只导入部分模型参数的方式
Jan 02 Python
python爬虫判断招聘信息是否存在的实例代码
Nov 20 Python
你喜欢篮球吗?Python实现篮球游戏
教你使用TensorFlow2识别验证码
Jun 11 #Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Python3中PyQt5简单实现文件打开及保存
Jun 10 #Python
Python selenium的这三种等待方式一定要会!
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
You might like
php在线解压ZIP文件的方法
2014/12/30 PHP
smarty中常用方法实例总结
2015/08/07 PHP
十大使用PHP框架的理由
2015/09/26 PHP
简述php环境搭建与配置
2016/12/05 PHP
利用PHP抓取百度阅读的方法示例
2016/12/18 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
2017/07/13 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
用javascript将数据库中的TEXT类型数据动态赋值到TEXTAREA中
2007/04/20 Javascript
web 页面分页打印的实现
2009/06/22 Javascript
利用JQuery和Servlet实现跨域提交请求示例分享
2014/02/12 Javascript
JavaScript截取、切割字符串的技巧
2016/01/07 Javascript
JavaScript中获取纯正的undefined的方法
2016/03/06 Javascript
jQuery改变form表单的action,并进行提交的实现代码
2016/05/25 Javascript
AngularJS入门教程之ng-checked 指令详解
2016/08/01 Javascript
JavaScript构建自己的对象示例
2016/11/29 Javascript
Vue2.0 实现单选互斥的方法
2018/04/13 Javascript
JS实现的哈夫曼编码示例【原始版与修改版】
2018/04/22 Javascript
JS/jQuery实现获取时间的方法及常用类完整示例
2019/03/07 jQuery
js字符串处理之绝妙的代码
2019/04/05 Javascript
Vue 子组件与数据传递问题及注意事项
2019/07/11 Javascript
JS几个常用的函数和对象定义与用法示例
2020/01/15 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
[01:55]2014DOTA2国际邀请赛快报:国土生病 紧急去医院治疗
2014/07/10 DOTA
Python实现简易Web爬虫详解
2018/01/03 Python
python使用time、datetime返回工作日列表实例代码
2019/05/09 Python
python的range和linspace使用详解
2019/11/27 Python
HTML5的文档结构和新增标签完全解析
2017/04/21 HTML / CSS
EMU Australia澳大利亚官网:澳大利亚本土雪地靴品牌
2019/07/24 全球购物
人力资源管理专业应届生求职信
2013/09/28 职场文书
力学专业毕业生自荐信
2013/11/17 职场文书
一份创业计划书范文
2014/02/08 职场文书
求职信名称怎么写
2014/05/26 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
开学典礼校长致辞
2015/07/29 职场文书
学习社交礼仪心得体会
2016/01/22 职场文书
2019新员工心得体会
2019/06/25 职场文书