【问题标题】:Request context in FastAPI?在 FastAPI 中请求上下文?
【发布时间】:2021-06-19 03:46:49
【问题描述】:

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),它们将获得正确的请求。

【问题讨论】:

  • 为了清晰起见,提供flask 代码可能会有所帮助。
  • 您可以使用基于类的处理程序,例如在 django 中。(当然我们自己实现了它们)

标签: python fastapi


【解决方案1】:

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

【讨论】:

  • 我知道我可以直接访问请求,但是在 Flask 中,我可以在调用堆栈中的任何位置访问它,而无需将其作为参数显式传递,即 flask.palletsprojects.com/en/1.1.x/reqcontext 我已经更新了要提出的问题这个明确的。
猜你喜欢
  • 1970-01-01
  • 2022-07-24
  • 2021-10-09
  • 1970-01-01
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 2021-09-11
相关资源
最近更新 更多