欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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