上下文#

Quart,类似于 Flask,具有两种上下文:应用程序上下文请求上下文。这两种上下文都存在于每个请求中,并允许解析全局代理 current_apprequest 等。请注意,这些上下文是任务本地的,因此如果任务由 ensure_futurecreate_task 生成,则它们将不存在。

这些上下文的設計原則是,它們可能在所有路由中都需要,因此与其传递这些对象,不如通过全局代理使其可用。这有其缺点,特别是与全局变量相关的所有参数。因此,建议仅在路由中使用这些代理,以隔离范围。

应用程序上下文#

应用程序上下文是任何与请求无关的信息的参考点。这包括应用程序本身、g 全局对象和仅绑定到应用程序的 url_adapter。上下文由请求上下文隐式创建和销毁。

请求上下文#

请求上下文是与请求相关的任何信息的参考点。这包括请求本身、绑定到请求的 url_adapter 和会话。它由每个请求的 handle_request() 方法创建和销毁。

WebSocket 上下文#

WebSocket 上下文类似于请求上下文,但仅与 WebSocket 请求相关。它由每个 WebSocket 连接的 handle_websocket_request() 方法创建和销毁。

任务和上下文#

上下文绑定到 ContextVar,并将被复制到从现有任务创建的任务中。为了显式复制上下文,Quart 提供了装饰器 copy_current_request_context()copy_current_websocket_context(),可以使用它们,如下所示:

@app.route('/')
async def index():

    @copy_current_request_context
    async def background_task():
        method = request.method
        ...

    asyncio.ensure_future(background_task())
    ...

如果您需要在异步生成器中提供 request 上下文,请使用 quart.helpers.stream_with_context() 装饰器,如 流式响应 中所述。

@app.route('/')
async def index():

    @stream_with_context
    async def async_generator():
        async for data in request.body:
            yield data

    await consume_data(async_generator())
    ...

注意

这些装饰器必须在现有上下文中使用,因此后台任务被定义为嵌套函数。