使用 FastAPI 的 APIRouter 时未找到详细信息错误

问题描述 投票:0回答:1

我的目录结构如下:

app
  >routers
   >items.py
  __init__.py
  main.py

在 main 中我有以下代码:

from typing import Union
import uvicorn
from fastapi import FastAPI, APIRouter
from routers import items



app = FastAPI()
app.include_router(items.router, prefix='/items', tags=['items'])

@app.get("/")
async def root():
    return {"message": "World World"}

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

items.py
内我有以下内容:

from fastapi import APIRouter

router = APIRouter(
    prefix="/items",
    tags=["items"]
)

@router.api_route("/items")
async def items():
    return {"test": "items"}

当我运行代码时,我可以访问我的网址 http:127.0.0.0:8000/ 并收到 Hello world 消息。 但是当我访问 http:127.0.0.0:8000/items 时,我看到一个错误:

{"detail": "not found"}

我该如何解决这个问题?我尝试对此进行调试,但是当我点击调试器并输入 items.router 时,它告诉我我正在从正确的路径正确导入。

fastapi
1个回答
2
投票

您在路线前添加了 3 次

/items
前缀!

router = APIRouter(prefix="/items", tags=["items"])
#                         ^^^^^^^^
...
@router.api_route("/items")
#                 ^^^^^^^^
...
app.include_router(items.router, prefix='/items', tags=['items'])
#                                       ^^^^^^^^

这意味着端点在

http://127.0.0.1:8000/items/items/items
可用。就此而言,您还添加了相同的标签两次,这是不必要的。

您还可以通过打开文档页面查看 openapi.json 导出的路由规范来看到这一点

enter image description here

您只需为每个端点/路由规则指定一次路由和一次标记。试试这个:

router = APIRouter(prefix="/items", tags=["items"])
...
@router.api_route("/")
...
app.include_router(items.router)

完整示例:

import uvicorn
from fastapi import FastAPI, APIRouter

router = APIRouter(prefix="/items", tags=["items"])


@router.api_route("/")
async def items():
    return {"test": "items"}


app = FastAPI()
app.include_router(router)


@app.get("/")
async def root():
    return {"message": "World World"}


if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)
© www.soinside.com 2019 - 2024. All rights reserved.