我們都知道在大型的應用程序或者 web api 中, 我們很少在一個文件中寫入多個路由
將所有的請求方法寫在同一個處理文件下面的話,會導致我們的代碼顯得很沒有邏輯性
這樣既不利於程序的擴展,也不利於程序日后的維護
在 Flask 中,我們一般用藍圖 Blueprint 來處理
那么在FastApi 中如何處理呢?
當然可以,在 FastApi 中使用 APIRouter 處理這種多程序分類
即類似 Flask 中的藍圖
APIRouter
假設專門用於處理用戶的文件是的子模塊/app/routers/users.py
您希望將與用戶相關的路徑操作與其余代碼分開,使其看起來簡潔明了。
可以使用來為該模塊創建路徑操作 APIRouter。
from fastapi import APIRouter
router = APIRouter()
@router.get("/users/", tags=["users"])
async def read_users():
return [{"username": "Rick"}, {"username": "Morty"}]
@router.get("/users/me", tags=["users"])
async def read_user_me():
return {"username": "fakecurrentuser"}
@router.get("/users/{username}", tags=["users"])
async def read_user(username: str):
return {"username": username}
web 服務中還有另外一個應用模塊,item
同樣的 通過 APIRouter 來對其路由進行注冊,代碼如下:app/routers/items.py
from fastapi import APIRouter, Depends, HTTPException
from ..dependencies import get_token_header
router = APIRouter(
prefix="/items",
tags=["items"],
responses={404: {"description": "Not found"}},
)
@router.get("/")
async def read_items():
return fake_items_db
@router.get("/{item_id}")
async def read_item(item_id: str):
if item_id not in fake_items_db:
raise HTTPException(status_code=404, detail="Item not found")
return {"name": fake_items_db[item_id]["name"], "item_id": item_id}
這樣就將兩個功能模塊 item, user
給分離開來了
后期我們想更新或擴展 user 模塊的功能,並不會對 item 造成影響!
上面便是 APIRouter
最最基礎也是最強大之處,還有其他功能嗎?
當然有!
自定義的tags,responses
細心的朋友應該發現了,在上述 item.py
中實例化 router
的時候,傳了好幾個參數
一起來看看分別代表什么含義!
prefix
參數,路由的前綴
tags
將應用於特定路徑操作的內容
responses
指特定於該路徑下的響應內容,如上述便指定 404
的返回信息
@router.put(
"/{item_id}",
tags=["custom"],
responses={403: {"description": "Operation forbidden"}},
)
async def update_item(item_id: str):
if item_id != "plumbus":
raise HTTPException(
status_code=403, detail="You can only update the item: plumbus"
)
return {"item_id": item_id, "name": "The great Plumbus"}
還支持擴展或重寫,增加其他功能
但是我們仍然可以添加更多 tags 將應用於特定路徑操作的內容,
注冊 APIRouter
最后一個步驟就是要將我們的 APIRouter 注冊到核心對象上去
和之前我們創建主文件一樣導入 FastApi,以及聲明的 APIRouter 實例
main.py
文件
from fastapi import Depends, FastAPI
from .dependencies import get_query_token, get_token_header
from .internal import admin
from .routers import items, users
app = FastAPI(dependencies=[Depends(get_query_token)])
app.include_router(users.router)
app.include_router(items.router)
app.include_router(
admin.router,
prefix="/admin",
tags=["admin"],
dependencies=[Depends(get_token_header)],
responses={418: {"description": "I'm a teapot"}},
)
@app.get("/")
async def root():
return {"message": "Hello Bigger Applications!"}
其中 include_router() 函數就是上面說的注冊。
這時候就完成了,使用該 app 來啟動服務即可
啟動命令如下:
uvicorn main:app --host=0.0.0.0 --port=8800

最后來驗證下打開接口文檔,查看接口

end