文章目录

            • 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 = 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