在 FastAPI 中请求上下文?

Request context in FastAPI?

Flask 中,请求可用于调用路径下的任何函数,因此不必显式传递。

FastAPI有没有类似的东西?

基本上,我想在同一个应用程序中允许请求是“真实的”或“虚拟的”,其中虚拟不会实际执行某些操作,只是发出它们(是的,我知道检查它在堆栈中并不好,但我无法控制所有代码)。

假设我有

@app.post("/someurl")
def my_response():
  func1()

def func1():
  func2()

def func2():
  # access some part of the request

即我不需要将请求作为参数一直传递到 func2。

在 Flask 中,我只是直接访问请求,但我不知道如何在 FastAPI 中执行此操作。 例如,在 Flask 中我可以做

def func2():
 x = request.my_variable
 # do somethinh with x

此处的请求是特定 URL 调用的本地请求,因此如果有两个并发执行 func2(使用任何 URL),它们将获得正确的请求。

FastAPI 为此使用 Starlette。

(来自文档的代码)

from fastapi import FastAPI, Request


app = FastAPI()


@app.get("/items/{item_id}")

def read_root(item_id: str, request: Request):

    client_host = request.client.host

    return {"client_host": client_host, "item_id": item_id}

参考:

Using Request Directly

编辑:

我不认为这是 FastAPI 开箱即用的功能。 Starlette 似乎也没有,但是有这个项目将上下文中间件添加到 Starlette,应该很容易集成到 FastAPI 应用程序中。

Starlette Context