什麼是Web框架和FastAPI?¶
在開始之前,我們先搞清楚幾個基礎概念:
Web框架:簡單來說,Web框架就是幫你快速搭建Web應用的工具。它封裝了處理HTTP請求、路由、數據處理等複雜細節,讓你能專注於業務邏輯。想象一下,如果沒有框架,你需要自己處理socket連接、解析HTTP協議、路由分發等,這會非常繁瑣。
FastAPI:這是一個基於Python的現代Web框架,它的核心特點是高性能(基於Starlette和Pydantic)、自動生成API文檔(Swagger UI和ReDoc)、支持異步編程(適合高併發場景),以及數據驗證。對於Python開發者來說,FastAPI已經成爲構建RESTful API的首選框架之一。
安裝與基礎示例¶
安裝FastAPI和服務器¶
FastAPI本身是Python庫,但需要一個ASGI服務器來運行(類似Django的Gunicorn+Uvicorn)。這裏我們用Uvicorn作爲服務器:
pip install fastapi uvicorn
第一個“Hello World”應用¶
創建一個main.py文件,輸入以下代碼:
from fastapi import FastAPI
# 創建FastAPI應用實例
app = FastAPI()
# 定義路由:當訪問根路徑("/")時觸發
@app.get("/")
def read_root():
return {"message": "Hello, FastAPI!"}
運行應用¶
在終端執行:
uvicorn main:app --reload
main:app:表示從main.py文件中導入名爲app的FastAPI實例--reload:自動檢測代碼變化並重啓服務器,方便開發
現在打開瀏覽器訪問 http://localhost:8000,就能看到返回的JSON數據:{"message": "Hello, FastAPI!"}。
路由與參數¶
路徑參數¶
你可以在URL中定義動態參數,比如獲取用戶ID的接口:
@app.get("/users/{user_id}")
def get_user(user_id: int): # 參數類型爲int,自動驗證
return {"user_id": user_id, "message": f"User {user_id} data"}
- 訪問
http://localhost:8000/users/123,會返回{"user_id": 123, "message": "User 123 data"} - FastAPI會自動驗證參數類型(如
user_id必須是整數,否則返回錯誤)
查詢參數¶
如果需要傳遞可選參數,可以用查詢參數:
@app.get("/search")
def search_items(query: str = None, limit: int = 10):
return {"query": query, "limit": limit}
- 訪問
http://localhost:8000/search?query=book&limit=5,返回{"query": "book", "limit": 5} - 參數默認值(如
query: str = None)表示該參數可選
數據驗證與Pydantic¶
FastAPI使用Pydantic庫進行數據驗證和序列化,確保請求數據符合預期格式。
定義數據模型¶
創建一個Item模型:
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
is_offer: bool = None # 可選字段,默認None
使用模型接收請求數據¶
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "item_price": item.price}
- 當發送POST請求到
/items/,並在請求體中傳入JSON數據(如{"name": "apple", "price": 5.99})時,FastAPI會自動驗證數據類型 - 如果數據格式錯誤(如
price寫成字符串),會返回清晰的錯誤提示
請求方法與數據處理¶
GET vs POST¶
- GET:用於獲取數據(如查詢列表),參數放在URL中,不適合提交敏感數據
- POST:用於提交數據(如創建資源),參數放在請求體中,更安全
處理POST請求(JSON數據)¶
用上面定義的Item模型處理JSON數據:
@app.post("/items/")
def create_item(item: Item):
return {"message": f"Created {item.name}", "price": item.price}
處理表單數據¶
如果是HTML表單提交,用Form類:
from fastapi import Form
@app.post("/login")
def login(username: str = Form(...), password: str = Form(...)):
return {"username": username, "status": "logged in"}
Form(...)表示該參數必填,用戶提交表單時會自動解析
自動生成API文檔¶
FastAPI最實用的特性之一是自動生成交互式API文檔,不需要手動寫文檔!
訪問Swagger UI¶
運行應用後,訪問 http://localhost:8000/docs,就能看到可視化的API文檔界面:
- 可以直接在頁面上測試所有接口(點擊”Try it out”)
- 自動顯示參數說明、返回格式和示例數據
ReDoc文檔¶
訪問 http://localhost:8000/redoc,是另一種格式的API文檔,更簡潔直觀。
異步支持(進階瞭解)¶
FastAPI支持異步編程,適合處理耗時操作(如數據庫查詢、外部API調用):
from fastapi import FastAPI
import asyncio
app = FastAPI()
@app.get("/async-data")
async def get_async_data():
# 模擬異步操作(如數據庫查詢)
await asyncio.sleep(1) # 等待1秒
return {"data": "This is async response"}
- 異步接口使用
async def定義,配合await關鍵字 - 高併發場景下,異步能顯著提升性能
總結與實踐建議¶
FastAPI的核心優勢在於簡單易用和自動生成文檔,非常適合快速開發RESTful API。
初學者實踐步驟:¶
- 安裝FastAPI和Uvicorn
- 完成基礎示例(Hello World、路徑參數、查詢參數)
- 使用Pydantic模型處理數據驗證
- 嘗試編寫GET和POST接口,測試API文檔
- 用異步函數處理簡單耗時操作
進階方向:¶
- 中間件(Middleware):處理所有請求/響應
- 依賴注入(Dependency Injection):複用代碼邏輯
- 數據庫集成(SQLAlchemy/FastAPI-SQLAlchemy)
- 中間件和CORS配置(處理跨域請求)
FastAPI的學習曲線平緩,從基礎到進階可以逐步擴展,建議結合官方文檔和實際項目練習,很快就能上手!