FastAPI swaggerUI 显示嵌套路由两次

时间:2021-01-26 11:42:39

标签: python swagger-ui openapi fastapi

我在 routes/__init__.py

中有这样的配置
## api/routes/__init__.py
router = APIRouter()
router.include_router(models_router, prefix="/models", tags=["models"])
...

这里是包含它们的 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() 

现在在模型路由器中,我还有两个这样的嵌套路由:

## 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)]
)

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

swagger ui docs

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

2 个答案:

答案 0 :(得分:1)

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

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

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

# 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"]
)

答案 1 :(得分:0)

可以采用以下结构来实施一些解决方法。出于演示目的,所有内容都放在一起:

fields_router = APIRouter()
...

model_data_router = APIRouter()
...

models_router = APIRouter()
...


aggregated_models_router = APIRouter()
aggregated_models_router.include_router(
    fields_router, 
    prefix="/{model_id}/fields", 
    tags=["fields"],
    dependencies=[Depends(pre_model_validation)]
)
aggregated_models_router.include_router(
    model_data_router, 
    prefix="/{model_id}/data", 
    tags=["model_data"],
    dependencies=[Depends(pre_model_validation)]
)
aggregated_models_router.include_router(
    models_router, 
    prefix="", 
    tags=["models"]
)
...

router = APIRouter()
router.include_router(aggregated_models_router, prefix="/models")
...

如果主路由器中没有 tags 参数,您将只得到 fieldsmodel_datamodels 部分,没有任何重复

相关问题