gpt4 book ai didi

fastapi - 是否有一种 FastAPI 方法可以在全局范围内访问当前的请求数据?

转载 作者:行者123 更新时间:2023-12-03 13:57:27 34 4
gpt4 key购买 nike

在 FastAPI 框架内:

虽然请求数据当然可以作为参数传递,但我想知道函数是否可以在不传递参数的情况下访问有关当前请求的信息。

免责声明:我不认为全局访问请求数据是一个好的做法,但我有一个用例,如果能够做到这一点会非常好。

最佳答案

提供的解决方案here定义一个上下文管理器,您可以全局访问它。对于每个请求,您都在提取相关信息(如 header )并将其传递给上下文管理器。
由于 fastapi 是使用 Starlette 构建的,您可以使用库starlette-context .它正在创建一个 context您可以在不将其作为参数传递的情况下使用的对象。主要的警告是您仍然需要将请求对象传递给您的所有路由。
编辑:在 starlette-context==0.3.0添加了新的中间件。 Starlette团队开始劝阻 (here) 使用他们的 BaseHTTPMiddleware ,特别是对于 StreamingResponse/FileResponse 端点。您可能想使用 RawContextMiddleware它也不需要请求对象,但它是实验性的,因为 Starlette 中没有文档用于编写没有接口(interface)的自定义中间件。但它似乎正在工作。
此库中的示例代码用于说明:

import uvicorn
from fastapi import FastAPI
from starlette.requests import Request
from starlette.responses import JSONResponse
from starlette.middleware import Middleware

from starlette_context import context, plugins
from starlette_context.middleware import ContextMiddleware

middleware = [
Middleware(
ContextMiddleware,
plugins=(
plugins.RequestIdPlugin(),
plugins.CorrelationIdPlugin()
)
)
]

app = FastAPI(debug=True, middleware=middleware)


@app.route('/')
async def index(request: Request): # This argument is still needed here
return JSONResponse(context.data) # Your context data


uvicorn.run(app, host="0.0.0.0")

关于fastapi - 是否有一种 FastAPI 方法可以在全局范围内访问当前的请求数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57204499/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com