我的目录结构如下:
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 时,它告诉我我正在从正确的路径正确导入。
您在路线前添加了 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 导出的路由规范来看到这一点
您只需为每个端点/路由规则指定一次路由和一次标记。试试这个:
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)