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()
'''
请求之前做的操作
请求之后做的操作
'''
这样做是不合适的,修改源代码是不可选的。
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
如对本文有疑问, 点击进行留言回复!!
C# 使用 ExcelDataReader 实现 Excel 转换为 DataTable
C# GET/POST 发送HTTP请求,自动提交表单,模拟网页登录/网页注册。填坑
httpclient org.apache.http.NoHttpResponseException: host:端口 failed to respond 错误原因和解决方法
网友评论