FastAPI中不同的OpenAPI模式取决于环境
我们有一个FastApi应用程序,它位于反向代理之后 代理使用Kerberos对用户进行身份验证,并将X-Remote-user HTTP头添加到请求中 FastApi应用程序需要此标头。以下是一个示例路线: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
@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)):
...
此处显示修补程序状态: