FastAPI swaggerUI 显示嵌套路由两次

shi*_*asu 5 python swagger-ui openapi fastapi

我有这样的配置routes/__init__.py

## api/routes/__init__.py
router = APIRouter()
router.include_router(models_router, prefix="/models", tags=["models"])
...
Run Code Online (Sandbox Code Playgroud)

这是main.py包括它们的。

## main.py
from api.routes import router as api_router
def get_app():
    app = FastAPI()
    app.include_router(api_router, prefix = "/api")
    ...

app = get_app() 
Run Code Online (Sandbox Code Playgroud)

现在在模型路由器内我还有两个嵌套路由,如下所示:

## api/routes/models.py
router.include_router(
    fields_router, 
    prefix="/{model_id}/fields", 
    tags=["fields"],
    dependencies=[Depends(pre_model_validation)]
)
router.include_router(
    model_data_router, 
    prefix="/{model_id}/data", 
    tags=["model_data"],
    dependencies=[Depends(pre_model_validation)]
)
Run Code Online (Sandbox Code Playgroud)

虽然这有效,但当我打开本地主机并使用生成的 SwaggerUI 文档时,它会显示类似这样的内容

swagger 用户界面文档:

嵌套端点也出现在/modelsAPI 内部以及它们单独的/fieldsAPI中/model_data。如何隔离嵌套路由,使其在 swagger 文档中显示为单独的 API,但仍保留在 API 内部定义/models

Sus*_*all 4

如果我理解正确,您希望所有端点都位于根路径下/api/models/,但希望 Swagger 文档仅在相应的“fields”或“model_data”标签下显示一次,同时将以下内容保留在“models”标签下:

  • 获取站点模型
  • 创建模型
  • 更新内容类型

如果上述内容正确,您可能希望根据需要使用相同的根路径来拆分它们,而不是嵌套导入,如下所示:

# api/routes/__init__.py
router = APIRouter()

router.include_router(
    models_router, 
    prefix="/models", 
    tags=["models"]
)

router.include_router(
    fields_router, 
    prefix="/models/{model_id}/fields", 
    tags=["fields"]
)

router.include_router(
    models_router, 
    prefix="/models/{model_id}/data", 
    tags=["model_data"]
)
Run Code Online (Sandbox Code Playgroud)