全面擁抱FastApi — 藍圖APIRouter


我們都知道在大型的應用程序或者 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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM