Python FastAPI 新手入門:半小時搭建高性能 API
FastAPI 是 Python 生態中最熱門的 Web 框架之一,以 高性能、自動生成文檔、強類型提示 為核心優勢,尤其適合構建 RESTful API 和數據接口。本文將從零基礎帶你入門,通過 8 個代碼實例,一步步掌握 FastAPI 的核心用法!

一、環境準備
首先安裝依賴庫(Python 3.7+ 版本):
pip install fastapi uvicorn- fastapi:框架核心
- uvicorn:ASGI 服務器(用于運行 FastAPI 應用)
二、Hello World:第一個 FastAPI 應用
創建文件 main.py,寫入以下代碼:
from fastapi import FastAPI
# 創建 FastAPI 實例
app = FastAPI()
# 定義路由:GET 請求 + 根路徑
@app.get("/")
def read_root():
return {"message": "Hello FastAPI!"}
# 啟動命令(終端運行):
# uvicorn main:app --reload運行效果:
(1) 終端執行啟動命令后,看到如下輸出:
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [xxxxx] using WatchFiles(2) 瀏覽器訪問 http://127.0.0.1:8000,會看到 JSON 響應:
{"message": "Hello FastAPI!"}(3) 自動生成接口文檔:訪問 http://127.0.0.1:8000/docs,會看到 Swagger UI 風格的交互式文檔(支持直接測試接口);訪問 http://127.0.0.1:8000/redoc,則是更簡潔的 ReDoc 文檔。
三、核心功能:路徑參數與查詢參數
1. 路徑參數(URL 中的參數)
用于傳遞必須的資源標識(如用戶 ID、商品 ID):
from fastapi import FastAPI
app = FastAPI()
# 路徑參數:item_id 是路徑的一部分,類型提示為 int
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}2. 查詢參數(URL 中 ? 后的參數)
用于傳遞可選的過濾條件(如分頁、搜索關鍵詞):
# 訪問示例:/items/5?q=apple
# 響應:{"item_id": 5, "q": "apple"}
# 若不傳 q:/items/5
# 響應:{"item_id": 5, "q": null}3. 類型校驗與默認值
FastAPI 會自動根據類型提示做數據校驗:
# 若訪問 /items/abc(item_id 不是 int),會返回 422 錯誤:
# {"detail": [{"loc": ["path", "item_id"], "msg": "value is not a valid integer", "type": "type_error.integer"}]}四、請求體:接收 JSON 數據
用于創建資源時傳遞復雜數據(如用戶注冊、提交表單),需配合 Pydantic 做數據校驗:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
# 定義請求體模型(Pydantic)
class Item(BaseModel):
name: str # 必選字段(無默認值)
price: float # 必選字段
is_offer: bool = None # 可選字段(默認值為 None)
# 接收 POST 請求 + JSON 體
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price}測試方式:
(1) 訪問 http://127.0.0.1:8000/docs,找到 /items/ 接口,點擊「Try it out」,輸入 JSON:
{
"name": "iPhone",
"price": 5999.9,
"is_offer": true
}(2) 點擊「Execute」,響應結果:
{"item_name": "iPhone", "item_price": 5999.9}(3) 若缺少必選字段(如 name),會自動返回 422 錯誤提示。
五、綜合示例:圖書管理 API
下面用一個完整的 CRUD 示例,展示 FastAPI 的實際應用:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List, Optional
app = FastAPI()
# 1. 定義數據模型
class Book(BaseModel):
id: Optional[int] = None # ID 可選(創建時自動生成)
title: str
author: str
price: float
# 2. 模擬數據庫(實際項目用 MySQL/PostgreSQL)
books = [
Book(id=1, title="Python 編程", author="張三", price=59.9),
Book(id=2, title="FastAPI 入門", author="李四", price=49.9)
]
# 3. CRUD 接口實現
# 獲取所有圖書
@app.get("/books", response_model=List[Book])
def get_all_books():
return books
# 獲取單本圖書(按 ID)
@app.get("/books/{book_id}", response_model=Book)
def get_book(book_id: int):
for book in books:
if book.id == book_id:
return book
# 若未找到,返回 404 錯誤
raise HTTPException(status_code=404, detail="圖書不存在")
# 創建圖書
@app.post("/books", response_model=Book)
def create_book(book: Book):
# 生成新 ID(取最后一本書的 ID +1,若為空則為 1)
new_id = books[-1].id + 1 if books else 1
new_book = Book(id=new_id, **book.dict())
books.append(new_book)
return new_book
# 更新圖書
@app.put("/books/{book_id}", response_model=Book)
def update_book(book_id: int, updated_book: Book):
for idx, book in enumerate(books):
if book.id == book_id:
# 保持原 ID,更新其他字段
books[idx] = Book(id=book_id, **updated_book.dict())
return books[idx]
raise HTTPException(status_code=404, detail="圖書不存在")
# 刪除圖書
@app.delete("/books/{book_id}")
def delete_book(book_id: int):
for idx, book in enumerate(books):
if book.id == book_id:
books.pop(idx)
return {"detail": "圖書已刪除"}
raise HTTPException(status_code=404, detail="圖書不存在")測試效果:
- 訪問 http://127.0.0.1:8000/docs,可直觀測試所有接口
- 例如創建圖書時,傳入 JSON 會自動校驗字段類型
- 響應結果會嚴格按照 response_model 格式返回
六、實用特性:依賴注入
FastAPI 的依賴注入系統可簡化代碼復用(如權限校驗、數據庫連接):
from fastapi import FastAPI, Depends
app = FastAPI()
# 定義依賴項(可復用的邏輯)
def get_current_user():
# 實際項目中可從 Token 解析用戶信息
return {"username": "admin", "role": "admin"}
# 接口中依賴該函數
@app.get("/users/me")
def read_current_user(user: dict = Depends(get_current_user)):
return user運行效果:
訪問 /users/me,響應:
{"username": "admin", "role": "admin"}七、跨域處理(CORS)
若前端(如 Vue/React)訪問 API,需解決跨域問題:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
# 配置允許的來源、方法、 headers
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # 生產環境需指定具體域名(如 ["http://localhost:8080"])
allow_credentials=True,
allow_methods=["*"], # 允許所有 HTTP 方法
allow_headers=["*"], # 允許所有請求頭
)
@app.get("/")
def read_root():
return {"message": "跨域已配置"}八、部署到生產環境
開發環境用 --reload 自動重啟,生產環境需優化配置:
# 生產環境啟動命令(使用 Gunicorn 作為反向代理)
pip install gunicorn
# 運行:workers 為 CPU 核心數 * 2 + 1
gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app九、總結
FastAPI 的核心優勢:
- 高性能:基于 ASGI 協議,支持異步,性能接近 Node.js/Go
- 自動文檔:無需額外配置,生成交互式 API 文檔
- 強類型校驗:Pydantic 保證數據合法性,減少調試成本
- 易用性:語法簡潔,學習曲線平緩
后續可深入學習:異步接口、WebSocket、身份認證(JWT)、數據庫集成(SQLAlchemy)等功能。






















