Flask中间件
程序员文章站
2022-06-15 19:46:58
文章目录1. call方法的执行2. 自定义中间件1. call方法的执行call方法在用户发起请求时才执行。flask 依赖 wsgi ,程序启动时执行的是 run_simple(host, port, self, **options)。在 app.py 文件中,会把 app 对象传入 run_simple 方法中。请求进来,第三个参数加括号,对象加括号执行__call__方法。def wsgi_app(self, environ, start_response): ctx = ....
文章目录
1. call方法的执行
call方法在用户发起请求时才执行。flask 依赖 wsgi ,程序启动时执行的是 run_simple(host, port, self, **options)
。在 app.py
文件中,会把 app 对象传入 run_simple 方法中。请求进来,第三个参数加括号,对象加括号执行__call__方法
。
def wsgi_app(self, environ, start_response):
ctx = self.request_context(environ)
error = None
try:
try:
ctx.push()
response = self.full_dispatch_request()
except Exception as e:
error = e
response = self.handle_exception(e)
except:
error = sys.exc_info()[1]
raise
return response(environ, start_response)
finally:
if self.should_ignore_error(error):
error = None
ctx.auto_pop(error)
def __call__(self, environ, start_response):
return self.wsgi_app(environ, start_response)
所有的请求入口就在 call 方法。
if __name__ == '__main__':
app.run()
app.run()
方法执行后,运行 run_simple(host, port, self, **options)
,在内部就是死循环,等待客户端发送请求(socket在监听连接)。此时 __call__
方法不会执行,有请求就会执行该方法。
修改源码:
def __call__(self, environ, start_response):
"""The WSGI server calls the Flask application object as the
WSGI application. This calls :meth:`wsgi_app` which can be
wrapped to applying middleware."""
print('请求之前做的操作')
data = self.wsgi_app(environ, start_response)
print('请求之后做的操作')
return data
if __name__ == '__main__':
app.run()
'''
请求之前做的操作
请求之后做的操作
'''
这样做是不合适的,修改源代码是不可选的。
2. 自定义中间件
class Middleware(object):
def __init__(self, old):
self.old = old
def __call__(self, *args, **kwargs):
print('请求之前做的操作')
ret = self.old(*args, **kwargs)
print('请求之后做的操作')
return ret
if __name__ == '__main__':
app.wsgi_app = Middleware(app.wsgi_app)
app.run()
通过 Middleware 中间件,在请求之前和请求之后做一些操作。
本文地址:https://blog.csdn.net/Thanlon/article/details/107272217
上一篇: 要有一颗永不服输的心