FastAPI中不同的OpenAPI模式取决于环境

FastAPI中不同的OpenAPI模式取决于环境,openapi,fastapi,Openapi,Fastapi,我们有一个FastApi应用程序,它位于反向代理之后 代理使用Kerberos对用户进行身份验证,并将X-Remote-user HTTP头添加到请求中 FastApi应用程序需要此标头。以下是一个示例路线: @app.get("/user/me") async def get_user_me(x_remote_user: str = Header(...)): return {"User": x_remote_user} 请求需要X-Remot

我们有一个FastApi应用程序,它位于反向代理之后

代理使用Kerberos对用户进行身份验证,并将X-Remote-user HTTP头添加到请求中

FastApi应用程序需要此标头。以下是一个示例路线:

@app.get("/user/me")
async def get_user_me(x_remote_user: str = Header(...)):
    return {"User": x_remote_user}
请求需要X-Remote-User标头,这是预期行为

当我们现在打开时,将记录标题,当单击“试用”时,我们可以提供标题值。 这种行为对于开发来说是非常好的,但在所有其他情况下,它都是不受欢迎的,因为头是由反向代理提供的。例如,我们使用生成客户机,然后客户机在其请求中都需要X-Remote-User参数

因此,具有区分不同环境的配置将非常有用。如果我们在反向代理之后,那么FastApi生成的OpenAPI模式不应该包含X-Remote-Header,否则如果我们正在开发中,应该包含它

到目前为止我所做的:

  • 我查看了有关这些模块的文档,也查看了其中的一些模块,但没有找到解决方案
  • 在文档中,我阅读了这一部分,但没有任何内容可以为我提供潜在的解决方案
  • 我也读过,但同样,没有解决办法
  • 我们可以更改生成的OpenApi模式。我在中画了这个,但这不是一个非常优雅的解决方案

有人能很好地解决这个问题吗?

一种方法是生成文档中描述的OpenApi模式。生成后,从架构中删除X-Remote-User。配置中可能有一个标志,指示应用程序在反向代理后面有条件地执行代码:

from fastapi import FastAPI
from fastapi.openapi.utils import get_openapi
from MyConfig import Config


app = FastAPI()


@app.get("/items/")
async def read_items():
    return [{"name": "Foo"}]

if Config.reverse_proxy:
    def custom_openapi():
        if app.openapi_schema:
            return app.openapi_schema
        openapi_schema = get_openapi(
            title="Custom title",
            version="2.5.0",
            description="This is a very custom OpenAPI schema",
            routes=app.routes,
        )
        // remove X-Remote-User here
        app.openapi_schema = openapi_schema
        return app.openapi_schema


    app.openapi = custom_openapi

然而,这并不是一个非常优雅的解决方案,因为我们需要解析Json字符串,并删除X-Remote-User头的不同深度嵌套实例。这很容易出现错误,导致架构无效。此外,如果添加新的Rest端点,它可能会中断。

我们可以使用
APIKeyHeader
从API签名中删除X-Remote-User标头,但仍然强制标头存在

from fastapi.security import APIKeyHeader

apiKey = APIKeyHeader(name="X-Remote-User")

@app.get("/user/me")
async def get_user_me(x_remote_user: str = Depends(apiKey)):
    return {"User": x_remote_user}
当标题不存在时,我们得到一个“403禁止”。如果存在,则检索头值


Swagger UI现在有一个按钮“Authorize”,我们可以在这里填写X-Remote-User的值以进行测试。

一个新的参数将很快用于
标题
查询
和其他从openAPI输出中排除元素的参数:
include_in_schema=False

例如:

def测试(x_forwarded_for:str=Header(无,包括_in_schema=False)):
...
此处显示修补程序状态: