什么是中间件。类似我们的GO中gin框架的所谓的中间件一样,它就是在我们的一个请求来之前可以做什么,请求完成后做什么。所以某种程度和意义上来说其实就是我们的Flask里面几个钩子函数。
借助于我们的钩子函数我们一样可以定义类似Gin那种中间件。这个中间件一样遵循我们的中间件的洋葱模型。
什么是洋葱模型, 就是一个请求进来的时候,经通过中间件的时候,会一个一个中间件的执行。稍后从我们的演示中可以看得出来。
在我们的具体的模块中间里面定义三个中间件。(仅用于演示)
定义我们的中间件类:
#!/usr/bin/evn python
# coding=utf-8
class MyMiddleware1():
def __init__(self, *args, **kwargs):
pass
def init_app(self, app, _is_handlers_aout=True):
self.app = app
if _is_handlers_aout:
self.register_handlers()
return self
def __before_request(self):
pass
print('MyMiddleware1-----before_request')
def __after_request(self, response):
pass
print('MyMiddleware1-----after_request=')
return response
def teardown_request(self, exc):
'''
请求结束的时候提交相关的日志
:param exc:
:return:
'''
pass
def register_handlers(self):
self.app.before_request(self.__before_request)
self.app.after_request(self.__after_request)
self.app.teardown_request(self.teardown_request)
PS:因为只是演示,其他中间一样,之类类目和输出的内容不一样,类名依次的为:
然后在middleware的__init__下初始化我们的中间对象实例:
#!/usr/bin/evn python
# coding=utf-8
from backend.middleware.middleware1 import MyMiddleware1
from backend.middleware.middleware2 import MyMiddleware2
from backend.middleware.middleware3 import MyMiddleware3
middleware1 = MyMiddleware1()
middleware2 = MyMiddleware2()
middleware3 = MyMiddleware3()
在我们的app.py里面进行注册初始化处理 修改我们的app.py中的__init_all_plugins函数方法,再次进行中间件的初始化。
def __init_all_plugins(app):
'''
# 全局初始化第三方的插件
:return:
'''
pass
# 导入中间件对象实例,使用init_app方式进行钩子函数的注册,_is_handlers_aout=true默认注册
from backend.middleware import middleware1,middleware2,middleware3
middleware1.init_app(app)
middleware2.init_app(app)
middleware3.init_app(app)
重新启动我们的服务,随意的访问我们的一个接口http://127.0.0.1:8808/backend_health,查看日志输出信息:
MyMiddleware1-----before_request
MyMiddleware2-----before_request
MyMiddleware3-----before_request
MyMiddleware3-----after_request=
MyMiddleware2-----after_request=
MyMiddleware1-----after_request=
127.0.0.1 - - [24/Feb/2021 16:35:49] "GET /backend_health HTTP/1.1" 200 -
在对比一下我们的洋葱模式,可以看到第一个中间件和的第一次执行,和最后一次的执行。
以上是关于我们的中间定义,后续我们的可以根据这个来扩展我们的日志中间等和鉴权token等。
小钟同学 | 文 【原创】【转载请联系本人】| QQ:308711822
原文作者:程序员小钟同学;如有侵权,请联系管理员删除。