我在 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 文档时,它会显示类似这样的内容
嵌套端点也出现在 /models
API 内部以及它们单独的 /fields
和 /model_data
API 中。如何隔离嵌套路由,使其在 swagger 文档中显示为单独的 API,但在 /models
API 中保持定义?
答案 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
参数,您将只得到 fields
、model_data
和 models
部分,没有任何重复