全面擁抱FastApi — 藍(lán)圖APIRouter

我們都知道在大型的應(yīng)用程序或者 web api 中, 我們很少在一個文件中寫入多個路由
將所有的請求方法寫在同一個處理文件下面的話,會導(dǎo)致我們的代碼顯得很沒有邏輯性
這樣既不利于程序的擴(kuò)展,也不利于程序日后的維護(hù)
在 Flask 中,我們一般用藍(lán)圖 Blueprint 來處理
那么在FastApi 中如何處理呢?
當(dāng)然可以,在 FastApi 中使用 APIRouter 處理這種多程序分類
即類似 Flask 中的藍(lán)圖
APIRouter
假設(shè)專門用于處理用戶的文件是的子模塊/app/routers/users.py
您希望將與用戶相關(guān)的路徑操作與其余代碼分開,使其看起來簡潔明了。
可以使用來為該模塊創(chuàng)建路徑操作 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 服務(wù)中還有另外一個應(yīng)用模塊,item
同樣的 通過 APIRouter 來對其路由進(jìn)行注冊,代碼如下: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 給分離開來了
后期我們想更新或擴(kuò)展 user 模塊的功能,并不會對 item 造成影響!
上面便是 APIRouter 最最基礎(chǔ)也是最強(qiáng)大之處,還有其他功能嗎?
當(dāng)然有!
自定義的tags,responses
細(xì)心的朋友應(yīng)該發(fā)現(xiàn)了,在上述 item.py 中實(shí)例化 router的時候,傳了好幾個參數(shù)
一起來看看分別代表什么含義!
prefix 參數(shù),路由的前綴
tags 將應(yīng)用于特定路徑操作的內(nèi)容
responses 指特定于該路徑下的響應(yīng)內(nèi)容,如上述便指定 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"}
還支持?jǐn)U展或重寫,增加其他功能
但是我們?nèi)匀豢梢蕴砑痈?tags 將應(yīng)用于特定路徑操作的內(nèi)容,
注冊 APIRouter
最后一個步驟就是要將我們的 APIRouter 注冊到核心對象上去
和之前我們創(chuàng)建主文件一樣導(dǎo)入 FastApi,以及聲明的 APIRouter 實(shí)例
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() 函數(shù)就是上面說的注冊。
這時候就完成了,使用該 app 來啟動服務(wù)即可
啟動命令如下:
uvicorn?main:app?--host=0.0.0.0?--port=8800

最后來驗(yàn)證下打開接口文檔,查看接口

