python3的模塊FastAPI,APIRouter
FastAPI 將依賴項的值從include_router傳遞給路由 FastAPI
依賴項和include_router
在FastAPI中,依賴項是一種重要的機制,用于處理從請求到響應的整個過程中所需的各種依賴關(guān)系,例如數(shù)據(jù)庫連接、身份驗證等。依賴項可以被注入到請求處理函數(shù)中,并在執(zhí)行時提供所需的值。在FastAPI中,我們可以使用Depends裝飾器來定義這些依賴項。
而include_router函數(shù)是FastAPI中的一種方式,用于將子路由包含到主路由中。通過include_router,我們可以將不同的路由分組,并在需要時將它們添加到主路由中。
實例1:
import uvicorn from fastapi import FastAPI,APIRouter router = APIRouter() #router = APIRouter(prefix='/add') ###prefix定義在router中 app = FastAPI() # 綁定路由和視圖函數(shù) @app.get("/") def index(): return {"msg": "fastapi測試成功"} # 異步 后面基本會用異步 速度快 @router.get("/numbers") async def A(): return {"msg": "we are adding numbers"} # 同步 @router.get("/strings") def B(): return {"msg": "we are adding strings"} ### 動態(tài)路徑 和 Flask 不同,F(xiàn)lask 是使用 <>,而 FastAPI 使用 {} @router.get("/{item_id}") def C(item_id): return {"msg": "we are adding {}".format({item_id})} app.include_router(router,prefix='/add') #app.include_router(router) ###prefix定義在router中 if __name__ == "__main__": uvicorn.run(app,host="0.0.0.0",port=8000)
在include_router中傳遞依賴項的值給路由
在某些情況下,我們可能需要在include_router中訪問依賴項的值,并將它們傳遞給子路由中的請求處理函數(shù)。為了實現(xiàn)這一點,我們可以使用Dependency類來注入依賴項的值,并將它們作為參數(shù)傳遞給請求處理函數(shù)。
實例2:
from fastapi import FastAPI,APIRouter,Depends router = APIRouter() app = FastAPI() async def get_current_user(): # 獲取當前用戶的邏輯 return {"username": "Alice"} async def get_db_connection(): # 獲取數(shù)據(jù)庫連接的邏輯 return "database_connection" # 異步 后面基本會用異步 速度快 @router.get("/users") async def A(current_user: dict = Depends(get_current_user)): return current_user ### 動態(tài)路徑 和 Flask 不同,F(xiàn)lask 是使用 <>,而 FastAPI 使用 {} @router.get("/{item_id}") async def C(item_id: int, db_connection: str = Depends(get_db_connection)): return {"item_id": item_id, "db_connection": db_connection} app.include_router(router,prefix='/add', dependencies=[Depends(get_current_user), Depends(get_db_connection)]) if __name__ == "__main__": uvicorn.run(app,host="0.0.0.0",port=8000)
在上面的示例中,定義了兩個依賴項函數(shù)get_current_user和get_db_connection。它們分別返回當前用戶的信息和數(shù)據(jù)庫連接。然后,我們使用APIRouter創(chuàng)建一個路由器,并在該路由器中定義了兩個路由,分別處理/users/me和/users/{user_id}的請求。
在include_router函數(shù)中,我們將這兩個依賴項函數(shù)作為dependencies參數(shù)傳遞給了該函數(shù)。這樣,在子路由中的請求處理函數(shù)中,我們就可以直接使用這兩個依賴項的值了。
例如,通過訪問/users/me路由,我們可以獲得當前用戶的信息。而通過訪問/users/{user_id}路由,我們可以獲得指定用戶ID的信息以及數(shù)據(jù)庫連接。
這樣,我們就成功地將依賴項的值從include_router傳遞給了路由。
FastAPI FastAPI事件處理程序
事件處理程序是當某個確定的事件發(fā)生時要執(zhí)行的功能。在FastAPI中,有兩個這樣的事件 - 啟動 和 關(guān)閉。 FastAPI的應用程序?qū)ο笥幸粋€ on_event() 裝飾器,使用這些事件之一作為參數(shù)。當相應的事件發(fā)生時,與該裝飾器注冊的函數(shù)被觸發(fā)。
啟動事件發(fā)生在開發(fā)服務器啟動之前,注冊的函數(shù)通常用于執(zhí)行某些初始化任務,建立與數(shù)據(jù)庫的連接等。關(guān)閉事件的事件處理程序在應用程序關(guān)閉前被調(diào)用。
例:
from fastapi import FastAPI
import datetime
app = FastAPI()
@app.on_event("startup")
async def startup_event():
print('Server started :', datetime.datetime.now())
@app.on_event("shutdown")
async def shutdown_event():
print('server Shutdown :', datetime.datetime.now())
浙公網(wǎng)安備 33010602011771號