Python Flask请求扩展与中间件相关知识总结
作者:淘小欣 发布时间:2022-03-10 17:03:06
一、请求扩展
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_request
和after_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()
来源:https://blog.csdn.net/weixin_44621343/article/details/117717517


猜你喜欢
- 1 基本信息- 模块主页:[github]- 类型:#第三方库2 安装方法pip install pythonping3 一般使用from
- 方法一:<script language="JavaScript"> <!--
- 前言schedule是一个第三方轻量级的任务调度模块,可以按照秒,分,小时,日期或者自定义事件执行时间。如果想执行多个任务,也可以添加多个t
- 音乐播放器可让您快速轻松地管理和收听所有音乐文件。在本文中,我将带您了解如何使用 Python 创建音乐播放器 GUI。如何使用 Pytho
- 前言很多人都认为人脸识别是一项非常难以实现的工作,看到名字就害怕,然后心怀忐忑到网上一搜,看到网上N页的教程立马就放弃了。这些人里包括曾经的
- 废话不多说了,直接给大家贴代码了。编写setup.py后$ python setup.py register$ python setup.p
- 安装pygal,可参阅:pip和pygal的安装实例教程基本XY线:import pygalfrom math import cos&quo
- python 自动化批量生成前端的HTML可以大大减轻工作量下面演示两种生成 HTML 的方法方法一:使用 webbrowser#codin
- 本文实例讲述了C#实现的ACCESS数据库操作类。分享给大家供大家参考,具体如下:这个是针对ACCESS数据库操作的类,同样也是从SQLHE
- Python中的字典由于是对象的集合属于复合数据类型,类似于列表。定义字典字典是 Python 对数据结构的实现,通常称为关联数组。字典由键
- 描述返回表达式,此表达式已被格式化为日期或时间。语法FormatDateTime(Date[, NamedFormat])FormatDat
- 下载MySQL-8.0.23点击下载:mysql-8.0.23-linux-glibc2.12-x86_64.tar.xz解压MySQL的安
- 什么是 BokehBokeh 是 Python 中的交互式可视化库。Bokeh提供的最佳功能是针对现代 Web 浏览器进行演示的高度交互式图
- 在用selenium爬取网页的时候,有时候需要登陆,这时候用selenium获取cookie和携带cookie是很方便的,获取cookie可
- 一、逻辑数据库和表的设计数据库的逻辑设计、包括表与表之间的关系是优化关系型数据库性能的核心。一个好的逻辑数据库设计可以为优化数据库和应用程序
- 本文实例讲述了Python 类的魔法属性用法。分享给大家供大家参考,具体如下:魔法属性无论人或事物往往都有不按套路出牌的情况,Python的
- 有序字典-OrderedDict简介示例有序字典和通常字典类似,只是它可以记录元素插入其中的顺序,而一般字典是会以任意的顺序迭代的。参见下面
- 前言十三届全国人大三次会议作了政府工作报告。这份政府工作报告仅有10500字左右,据悉是改革开放40年以来最短的一次。受到疫情影响,今年的两
- 1. 警告不是异常你是不是经常在使用一些系统库或者第三方模块的时候,会出现一些既不是异常也不是错误的警告信息?这些警告信息,有时候非常多,对
- 前端css中用到less,在pycharm中安装配置less操作步骤如下:1.点开setting,在Plugins中搜索node.js(安装