FastAPI - @Schema(hidden=True)在尝试隐藏swagger文档上的架构部分时不起作用

9avjhtql  于 2023-02-22  发布在  其他
关注(0)|答案(4)|浏览(852)

我试图隐藏FastAPI生成的swagger文档的整个schema部分。我已经检查了文档并尝试了此操作,但schema部分仍然显示。

@Schema(hidden=True)
    class theSchema(BaseModel):
        category: str

如何从返回的swagger文档中省略一个特定的schema或整个schema部分。
docExpansion似乎也不起作用。我错过了什么?

app = FastAPI(
    openapi_tags=tags_metadata,
    title="Documentation",
    description="API endpoints",
    version="0.1",
    docExpansion="None"
)
wqsoz72f

wqsoz72f1#

swagger具有UI参数"defaultModelsExpandDepth",用于控制schema部分中的模型视图。
可在FastApi初始化时使用"swagger_ui_parameters"参数转发此参数。

app = FastAPI(swagger_ui_parameters={"defaultModelsExpandDepth": -1})

数值:

  • -1:架构节隐藏
  • 0:架构节已关闭
  • 1:模式部分打开(默认)

更多选项可在此处找到:https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/

kxeu7u2r

kxeu7u2r2#

将args中的include_in_schema=False设置为FastAPI示例装饰器

app = FastAPI(...)

@app.get("/", include_in_schema=False)
async def root():
    ...
t1qtbnec

t1qtbnec3#

我不确定回答我自己的问题是否能得分,但如果有人想知道,这个问题的解决方法是将swagger页面加载到iframe中,然后使用js在该文档的iframe中隐藏所需的元素。

s5a0g9ez

s5a0g9ez4#

我有一个类似的需求,我想排除某些模式,包括“Enum”模式,唯一的方法是生成定制的OpenAPI模式,如FastAPI docs中所述。
首先,使用“schema_extra”pydantic模型配置在生成的json中添加一个隐藏字段,这可以在pydantic's documentation中找到。

class ModelA(BaseModel):
    Field1: int | None = None
    Field2: str | None = None

class Config:
    schema_extra = {"hidden": True}

然后,您可以使用生成自定义OpenAPI架构,

def custom_openapi():
    if app.openapi_schema:
        return app.openapi_schema
    openapi_schema = get_openapi(
        title="My app",
        version="1.0",
        description="My app's description",
        routes=app.routes,
    )
    if "components" in openapi_schema:
        # I used jsonref to dereference related schemas
        # You will need to install jsonref
        dereferenced_schema = jsonref.loads(json.dumps(openapi_schema), lazy_load=False)
        openapi_schema["components"] = jsonable_encoder(dereferenced_schema["components"])
        for schema_name in openapi_schema["components"]["schemas"].copy().keys():
            schema = openapi_schema["components"]["schemas"][schema_name]
            if "enum" in schema:
                print(f"Removing {schema_name} as it is an enum")
                del openapi_schema["components"]["schemas"][schema_name]
                continue

            hide = schema.get("hidden", False)
            if hide:
                print(f"Removing {schema_name} as it is hidden")
                del openapi_schema["components"]["schemas"][schema_name]
                continue

    app.openapi_schema = openapi_schema
    return app.openapi_schema

最后,将此自定义函数分配给FastAPI应用的openapi函数,如下所示-

app.openapi = custom_openapi

希望这个有用。

相关问题