大家好,FastAPI是一種現代、高性能的Python Web框架,用于構建Web應用程序和API。它基于Python的異步編程庫asyncio
和await
語法,以及類型注解和自動文檔生成等特性,提供了快速、易用和可靠的開發體驗,接下來本文將介紹10項被忽視的FastAPI實用功能。
1. 依賴注入
FastAPI支持定義“依賴項”,這些依賴項會被解析并注入到路徑操作中,使用這個功能處理常見任務,如數據庫連接或用戶身份驗證。
def?get_db():db?=?SessionLocal()try:yield?dbfinally:db.close()@app.get("/users/{user_id}")
def?read_user(user_id:?int,?db:?Session?=?Depends(get_db)):user?=?db.query(User).get(user_id)return?user
2. 響應模型
使用Pydantic模型聲明響應結構,這將自動生成API文檔并驗證響應數據。
class?User(BaseModel):id:?intname:?str@app.get("/users/{user_id}",?response_model=User)
def?read_user(user_id:?int):?...
3. HTTP異常
拋出帶有狀態代碼和詳細信息的HTTP異常,以處理不同的HTTP狀態代碼。
@app.get("/items/{item_id}")
def?read_item(item_id:?str):if?item_id?not?in?items:raise?HTTPException(status_code=404,?detail="Item?not?found")return?{"item":?items[item_id]}
4. 路徑參數和轉換器
使用轉換器將路徑參數轉換為所需的Python數據類型。
@app.get("/items/{item_id}")
def?read_item(item_id:?int):?...
5. 后臺任務
將需要長期運行的任務委托給后臺,以釋放API的響應時間。
@app.post("/send-notification/{email}")
async?def?send_notification(email:?str,?background_tasks:?BackgroundTasks):background_tasks.add_task(send_email,?email=email)return?{"message":?"Notification?sent?in?the?background"}
6. 查詢參數和字符串驗證
使用Query聲明字符串查詢參數和驗證。
@app.get("/items/")
async?def?read_items(q:?Optional[str]?=?Query(None,?max_length=50)):results?=?{"items":?[{"item_id":?"Foo"}]}if?q:results.update({"q":?q})return?results
7. 帶密碼(和散列)的OAuth2和使用JWT令牌的Bearer
FastAPI內置了OAuth2密碼和Bearer,用于處理用戶注冊、登錄和令牌檢索的所有路徑。
@app.post("/token",?response_model=Token)
def?login_for_access_token(form_data:?OAuth2PasswordRequestForm?=?Depends()):user?=?authenticate_user(fake_users_db,?form_data.username,?form_data.password)if?not?user:raise?HTTPException(status_code=400,?detail="Incorrect?username?or?password")access_token_expires?=?timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)access_token?=?create_access_token(data={"sub":?user.username},?expires_delta=access_token_expires)return?{"access_token":?access_token,?"token_type":?"bearer"}
8. 使用Pydantic進行數據驗證和序列化
FastAPI使用Pydantic進行數據驗證和序列化,提供了一種處理錯誤和復雜類型的簡單方式。
class?Item(BaseModel):name:?strdescription:?str@app.post("/items/")
async?def?create_item(item:?Item):return?item
9. 使用Starlette的TestClient進行測試
FastAPI支持使用Starlette的TestClient編寫簡潔的測試用例。
from?starlette.testclient?import?TestClientdef?test_read_main():client?=?TestClient(app)response?=?client.get("/")assert?response.status_code?==?200
10. 自動交互式API文檔
FastAPI通過Swagger UI和ReDoc提供自動交互式API文檔,只需訪問/docs
或/redoc
路由即可訪問這些文檔。