Python Flask请求扩展机制与中间件实现详解
本文系统梳理Flask框架中的请求扩展机制,详细解析before_request、after_request、teardown_request等钩子的执行顺序与返回值影响。同时介绍基于[[wp:a11]]类实现自定义WSGI中间件的方法,涵盖错误处理、模板全局函数及过滤器的高级用法,帮助开发者掌握Flask请求生命周期的核心控制手段。
一、请求扩展
1.before_request
该机制类似于Django中间件中的process_request,在请求到达具体路由函数之前触发执行。若注册了多个before_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。在请求未发生异常且即将返回响应之前执行。若注册了多个after_request处理器,它们的执行顺序是从下往上(即后注册的先执行)。
@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
该处理器在每个路由函数执行完毕后触发,即使执行过程中发生异常也会运行。需要注意的是,teardown_request的返回值无效,不能用于控制响应结果。
常用于记录日志或清理资源。
@app.teardown_request
def ter(e): # e就是上一个路由函授执行过程中出现被捕获的异常信息.
print(e)
print('我是teardown_request ')
5.errorhandler
用于绑定特定的HTTP状态码,从而捕获服务器错误并返回对应的错误页面。
@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()
到此这篇关于Python Flask请求扩展与中间件相关知识总结的文章就介绍到这了,更多相关Flask请求扩展与中间件内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









