app = FastAPI()

@app.get("/")
def read_root():
return {"message": "Hello, World!"}

這段代碼做了啥呢?首先我們導入了FastAPI類,接著創(chuàng)建了一個app實例。然后通過裝飾器@app.get("/")定義了一個GET請求的路由,當訪問根路徑時就會調用read_root函數(shù),返回一個字典,里面包含了我們的問候語。

要啟動這個API,回到命令行,運行uvicorn main:app --reload--reload參數(shù)可以讓Uvicorn在代碼變化時自動重啟服務器,方便調試。

3、異步函數(shù)的魅力

FastAPI天生支持異步編程,這可是個大殺器。異步函數(shù)可以同時處理多個任務,不會因為等待某個操作完成而阻塞整個程序。修改剛才的read_root函數(shù),加上async關鍵字試試看。

@app.get("/")
async def read_root():
return {"message": "Hello, async world!"}'

現(xiàn)在這個函數(shù)變成了異步的,雖然看起來沒多大區(qū)別,但在處理I/O密集型任務(比如數(shù)據(jù)庫查詢、網絡請求)時,它的性能提升可就不是一點兩點了。

4、添加路徑參數(shù)

有時候你想讓API更靈活一些,比如根據(jù)不同的用戶ID返回特定的信息。這時候就可以用到路徑參數(shù)了。看看下面的例子:

@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}

這里{item_id}就是路徑參數(shù),它會自動轉換成整數(shù)類型。這樣你就可以通過/items/1這樣的URL來獲取特定項的信息了。

溫馨提示:記得檢查路徑參數(shù)的數(shù)據(jù)類型哦,要是傳入了不符合要求的值,FastAPI會幫你自動返回422錯誤,不過最好還是自己提前做好驗證。

5、查詢參數(shù)與默認值

除了路徑參數(shù),你還可能需要根據(jù)用戶的額外需求來調整返回的內容。查詢參數(shù)就能派上用場了。來看個例子:

from typing import Union

@app.get("/items/")
async def read_item(q: Union[str, None] = None):
if q:
return {"q": q}
return {"message": "No query parameter"}

q就是一個查詢參數(shù),如果用戶在請求中提供了?q=something,那么q就會有值;如果沒有提供,q就會是None。為了不讓代碼出錯,我們給q設了個默認值None,并使用了typing.Union來告訴FastAPI這個參數(shù)可能是字符串也可能是None

6、請求體與數(shù)據(jù)校驗

當你要接收用戶提交的數(shù)據(jù)時,就需要用到請求體了。FastAPI結合Pydantic庫,可以輕松地定義數(shù)據(jù)模型,并自動進行數(shù)據(jù)校驗。舉個栗子:

from pydantic import BaseModel

class Item(BaseModel):
name: str
description: Union[str, None] = None
price: float
tax: Union[float, None] = None

@app.post("/items/")
async def create_item(item: Item):
return item

Item類定義了請求體的結構,每個字段都指定了類型,還可以設置默認值。當你POST一個JSON對象到/items/時,F(xiàn)astAPI會自動解析并驗證數(shù)據(jù),只有符合模型定義的數(shù)據(jù)才會被接受。

7、自動化交互文檔

說到這兒,不得不提一下FastAPI最酷炫的功能之一——自動化交互文檔。只要你按照規(guī)范定義了API,FastAPI就會自動生成Swagger UI或ReDoc界面。這些界面上不僅可以查看API文檔,還能直接測試API功能,簡直不要太方便。

訪問http://127.0.0.1:8000/docs或者http://127.0.0.1:8000/redoc就能看到它們了。是不是超省心?

8、安全性考量

構建API的時候,安全性絕對不能忽視。FastAPI提供了多種方式來保護你的API,比如OAuth2認證、依賴注入等。你可以根據(jù)實際需求選擇合適的安全措施。比如說,想要限制某些敏感接口只能由授權用戶訪問,就可以用Depends來添加認證邏輯。

from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

async def get_current_user(token: str = Depends(oauth2_scheme)):
# 這兒寫你的認證邏輯
fake_user_db = {"johndoe": "secret"}
user = fake_user_db.get(token)
if not user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Invalid authentication credentials",
headers={"WWW-Authenticate": "Bearer"},
)
return user

@app.get("/users/me")
async def read_users_me(current_user: str = Depends(get_current_user)):
return {"user": current_user}

這段代碼展示了如何用OAuth2PasswordBearer來獲取用戶提供的Token,并通過Depends將其傳遞給認證函數(shù)。如果認證失敗,就會拋出異常,阻止未授權的訪問。

二、fastapi 最佳實踐方式

以下是使用FastAPI時的一些最佳實踐方式,確保你在構建應用時能夠遵循fastapi 最佳實踐:

  1. 項目結構
    保持項目結構一致和可預測是非常重要的。一個清晰的項目結構有助于其他開發(fā)者通過查看項目結構就能對項目內容有所了解,這是fastapi 最佳實踐的第一步。
  2. 使用Pydantic進行數(shù)據(jù)驗證
    過度使用Pydantic進行數(shù)據(jù)驗證是一個好習慣,它可以幫助確保數(shù)據(jù)的準確性和安全性,這是fastapi 最佳實踐中的關鍵一環(huán)。
  3. 依賴注入
    使用依賴注入進行數(shù)據(jù)驗證,而不是直接在路由函數(shù)中進行驗證。這樣可以提高代碼的可重用性和可測試性,是fastapi 最佳實踐中的一個重要方面。
  4. 鏈式依賴
    依賴可以被鏈式調用,并且依賴調用的結果會被緩存,這有助于提高性能,是fastapi 最佳實踐中的一個高效策略。
  5. 遵循REST原則
    設計API時遵循REST原則,保持接口的無狀態(tài)性、可緩存性等特性,這是fastapi 最佳實踐中的基本要求。
  6. 異步路由
    如果你的路由中只有阻塞型I/O操作,那么無需將其設置為異步,這是fastapi 最佳實踐中的一個性能優(yōu)化技巧。
  7. 自定義基礎模型
    從項目一開始就定義自定義的基礎模型,這有助于保持代碼的一致性和可維護性,是fastapi 最佳實踐中的一個關鍵步驟。
  8. 文檔生成
    FastAPI自動生成API文檔,確保從項目開始就啟用和維護這些文檔,這是fastapi 最佳實踐中的一個基本實踐。
  9. 使用Pydantic的BaseSettings管理配置
    使用Pydantic的BaseSettings來管理項目配置,這樣可以保持配置的一致性和安全性,是fastapi 最佳實踐中的一個推薦做法。
  10. 數(shù)據(jù)庫命名約定
    為數(shù)據(jù)庫設置命名約定,以保持數(shù)據(jù)庫結構的一致性,這是fastapi 最佳實踐中的一個數(shù)據(jù)庫管理技巧。
  11. 異步測試客戶端
    從項目一開始就設置異步測試客戶端,這有助于確保測試的準確性和效率,是fastapi 最佳實踐中的一個測試策略。
  12. 背景任務
    使用BackgroundTasks而不是直接使用asyncio.create_task,這樣可以更好地管理后臺任務,是fastapi 最佳實踐中的一個任務管理技巧。
  13. 類型注解
    在FastAPI中使用類型注解是非常重要的,它有助于提高代碼的可讀性和可維護性,是fastapi 最佳實踐中的一個編碼標準。
  14. 文件分塊保存
    當處理大文件時,應該分塊保存文件,以避免內存溢出,這是fastapi 最佳實踐中的一個文件處理技巧。
  15. 動態(tài)Pydantic字段
    小心使用動態(tài)Pydantic字段,因為它們可能會增加代碼的復雜性,這是fastapi 最佳實踐中的一個注意事項。
  16. SQL-first, Pydantic-second
    在設計數(shù)據(jù)庫模型時,應該先考慮SQL模型,然后再考慮Pydantic模型,這是fastapi最佳實踐中的一個模型設計原則。
  17. 自定義Pydantic驗證器
    在自定義Pydantic驗證器時,如果直接面向客戶端,應該拋出ValueError,以提供更詳細的錯誤信息,這是fastapi最佳實踐中的一個驗證技巧。
  18. 同步SDK的使用
    如果必須使用同步SDK,應該在線程池中運行它,以避免阻塞異步事件循環(huán),這是fastapi 最佳實踐中的一個異步處理技巧。
  19. 代碼格式化和 linting
    使用代碼格式化工具如black和ruff,以及l(fā)inting工具來保持代碼的整潔和一致性,這是fastapi 最佳實踐中的一個代碼管理實踐。

三、結束語

今天咱聊了這么多關于FastAPI的東西,從安裝到創(chuàng)建API,再到異步函數(shù)、路徑參數(shù)、查詢參數(shù)、請求體、自動化文檔和安全性。你會發(fā)現(xiàn),用FastAPI構建API真的挺簡單,而且效率極高。希望這些內容能幫助你更好地理解和使用FastAPI,快去動手試試吧!

文章轉自微信公眾號@彩虹的生財日常

上一篇:

.NET Core 3.x 構建 RESTFUL API

下一篇:

使用LangChain和異步Web框架實現(xiàn)接口流式輸出功能
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數(shù)據(jù)驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費