python-3.x 使用fastapi APIRouter时未找到详细信息错误

7lrncoxx  于 2023-05-02  发布在  Python
关注(0)|答案(1)|浏览(221)

我的目录结构如下:app〉routers〉 www.example.cominit.py www.example.com
在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)

在 www.example.com 我有以下内容:

from fastapi import APIRouter

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

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

当我运行代码时,我可以转到我的URL http: www.example.com 。但是当我访问http: www.example.com 我看到一个错误:

{"detail": "not found"}

我该怎么解决这个问题?我试着调试这个,但当我打我的调试器,和类型的项目.路由器它告诉我,即时通讯正确导入从正确的路径.谢谢

fwzugrvs

fwzugrvs1#

您给路由加了三次/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

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

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)

相关问题