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系统使用python监测系统负载脚本分享
Jan 15 Python
Python使用struct处理二进制的实例详解
Sep 11 Python
python数据结构之链表详解
Sep 12 Python
Python smtplib实现发送邮件功能
May 22 Python
Python控制Firefox方法总结
Jun 03 Python
python字符串切割:str.split()与re.split()的对比分析
Jul 16 Python
Django实现auth模块下的登录注册与注销功能
Oct 10 Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
Feb 18 Python
Java多线程实现四种方式原理详解
Jun 02 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
Jun 09 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
Nov 20 Python
Django实现聊天机器人
May 31 Python
你喜欢篮球吗?Python实现篮球游戏
教你使用TensorFlow2识别验证码
Jun 11 #Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Python3中PyQt5简单实现文件打开及保存
Jun 10 #Python
Python selenium的这三种等待方式一定要会!
python实现股票历史数据可视化分析案例
Python如何识别银行卡卡号?
You might like
Discuz 6.0+ 批量注册用户名
2009/09/13 PHP
javascript 处理HTML元素必须避免使用的一种方法
2009/07/30 Javascript
AeroWindow 基于JQuery的弹出窗口插件
2011/06/27 Javascript
利用js读取动态网站从服务器端返回的数据
2014/02/10 Javascript
javascript使用正则控制input输入框允许输入的值方法大全
2014/06/19 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
JavaScript实现的多种鼠标拖放效果
2015/11/03 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
JS实现重新加载当前页面
2016/11/29 Javascript
解析利用javascript如何判断一个数为素数
2016/12/08 Javascript
深入理解JavaScript中的尾调用(Tail Call)
2017/02/07 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
JavaScript实现移动端轮播效果
2017/06/06 Javascript
security.js实现的RSA加密功能示例
2018/06/06 Javascript
Vue iview-admin框架二级菜单改为三级菜单的方法
2018/07/03 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
2018/09/07 Javascript
使用node搭建自动发图文微博机器人的方法
2019/03/22 Javascript
Vue 实现从文件中获取文本信息的方法详解
2019/10/16 Javascript
从0搭建vue-cli4脚手架
2020/06/17 Javascript
JavaScript 实现轮播图特效的示例
2020/11/05 Javascript
[03:35]2018年度DOTA2最佳辅助位选手5号位-完美盛典
2018/12/17 DOTA
用Python编写一个每天都在系统下新建一个文件夹的脚本
2015/05/04 Python
利用Python中unittest实现简单的单元测试实例详解
2017/01/09 Python
基于hashlib模块--加密(详解)
2017/06/21 Python
Python二叉树定义与遍历方法实例分析
2018/05/25 Python
django项目简单调取百度翻译接口的方法
2019/08/06 Python
Numpy 多维数据数组的实现
2020/06/18 Python
Django多数据库联用实现方法解析
2020/11/12 Python
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
是否有自动比较结构的方法
2015/06/03 面试题
实现向右循环移位
2014/07/31 面试题
中学自我评价
2014/01/31 职场文书
学习十八大报告感言
2014/02/04 职场文书
国窖1573广告词
2014/03/21 职场文书
班级学习雷锋活动总结
2014/07/04 职场文书