什麼是API?¶
想象你用手機上的外賣APP下單,APP需要向餐廳服務器請求“返回菜品列表”“提交訂單信息”,這個“請求-響應”的過程就是API在工作。簡單說,API是不同軟件系統之間“溝通的橋樑”,讓數據能在客戶端(如手機、網頁)和服務器之間安全高效地傳遞。
爲什麼選擇FastAPI?¶
在Python的Web框架中,FastAPI是個“後起之秀”,但憑藉幾個優勢迅速流行:
- 簡單易用:語法接近Python原生,不需要複雜配置
- 高性能:速度快(性能接近Node.js和Go),適合高併發場景
- 自動文檔:自帶Swagger UI和ReDoc,開發後能立即生成交互式API文檔
- 類型提示支持:結合Python的類型註解,自動生成代碼提示和數據驗證
- 異步友好:支持異步編程,處理長時間任務(如數據庫查詢)更高效
快速入門:安裝與第一個“Hello World”¶
安裝FastAPI和服務器¶
首先安裝FastAPI和運行服務器工具Uvicorn:
pip install fastapi uvicorn
編寫第一個接口¶
創建一個main.py文件,寫入以下代碼:
from fastapi import FastAPI
# 初始化FastAPI應用
app = FastAPI()
# 定義路由和處理函數
@app.get("/") # 當用戶訪問根路徑"/"時,使用GET方法
def read_root():
return {"message": "Hello, FastAPI!"} # 返回JSON格式數據
運行接口¶
在終端執行:
uvicorn main:app --reload
main:app表示運行main.py文件中的app實例,--reload讓代碼修改後自動重啓。
此時訪問 http://localhost:8000,就能看到返回的 {"message": "Hello, FastAPI!"}。
核心概念一:路由與視圖函數¶
路由就像給接口“貼標籤”——當用戶訪問某個URL時,FastAPI會根據標籤找到對應的“處理函數”(視圖函數)。
例如:
@app.get("/hello") # 路由路徑爲"/hello",請求方法爲GET
def say_hello():
return {"message": "Hello, FastAPI!"}
訪問 http://localhost:8000/hello,就會觸發say_hello函數,返回結果。
核心概念二:請求方法(GET/POST等)¶
不同的請求方法對應不同的業務場景:
- GET:獲取數據(如查詢列表、詳情),參數放在URL中
- POST:提交數據(如新增用戶、上傳文件),參數放在請求體中
GET請求示例(查詢參數)¶
@app.get("/items/") # 路徑爲"/items/"
def get_items(limit: int = 10, offset: int = 0): # 可選參數limit和offset
return {"limit": limit, "offset": offset}
訪問 http://localhost:8000/items/?limit=20&offset=5,會返回 {"limit": 20, "offset": 5}。
POST請求示例(請求體)¶
POST需要在請求體中提交數據,用Pydantic模型定義數據格式(後續會詳細講):
from pydantic import BaseModel
# 定義數據模型(指定字段類型)
class Item(BaseModel):
name: str
price: float
is_offer: bool = None # 可選字段
@app.post("/items/") # POST請求,提交Item數據
def create_item(item: Item):
return {"item": item.dict(), "message": "Item created!"}
此時向/items/提交JSON數據(如{"name": "手機", "price": 999.99}),FastAPI會自動驗證數據類型並返回結果。
核心概念三:處理請求數據的三種方式¶
- 路徑參數:URL中的動態部分(如
/user/{user_id})
@app.get("/user/{user_id}")
def get_user(user_id: int): # user_id是整數類型
return {"user_id": user_id, "message": f"用戶{user_id}的信息"}
- 查詢參數:URL末尾用
?分隔的鍵值對(如/search?q=python)
@app.get("/search")
def search(q: str, page: int = 1):
return {"query": q, "page": page}
- 請求體:複雜數據(如表單、JSON),通過Pydantic模型接收
(見上文POST示例,Item模型會自動解析請求體的JSON數據)
核心概念四:構建響應與狀態碼¶
返回數據¶
FastAPI會自動將函數返回的Python數據(如字典、列表)轉爲JSON格式,無需手動序列化。
自定義狀態碼¶
默認返回200 OK,但可通過status_code參數指定:
from fastapi import status
@app.post("/items/", status_code=status.HTTP_201_CREATED)
def create_item(item: Item):
return {"item": item} # 創建成功返回201狀態碼
核心概念五:數據驗證(Pydantic模型)¶
Pydantic是FastAPI的“數據管家”,通過類型註解自動驗證請求數據:
class User(BaseModel):
name: str # 必須是字符串
age: int # 必須是整數
email: str | None = None # 可選字段,默認None
@app.post("/register/")
def register(user: User):
if user.age < 18:
return {"error": "年齡必須≥18"}
return {"user": user.dict(), "message": "註冊成功"}
若提交數據不合法(如age爲字符串),FastAPI會返回清晰的錯誤提示。
核心概念六:自動API文檔¶
FastAPI自帶Swagger UI和ReDoc,開發完接口後可直接測試:
- 訪問 http://localhost:8000/docs(Swagger UI,交互式調試界面)
- 訪問 http://localhost:8000/redoc(ReDoc,更美觀的文檔)
這些文檔會自動生成接口說明、參數示例和響應格式,無需手動寫文檔!
總結與下一步¶
通過以上內容,你已掌握FastAPI的核心基礎:
- 用路由+視圖函數定義接口
- 處理GET/POST等請求方法和數據
- 通過Pydantic驗證數據合法性
- 利用自動文檔快速調試
下一步可以學習:
- 異步接口開發(async def)
- 中間件與依賴注入(如數據庫連接、認證)
- 與數據庫集成(SQLAlchemy)
FastAPI簡單且強大,只要多動手寫接口,很快就能熟練掌握!