FastAPI入門:Python開發者必學的Web框架基礎

什麼是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。

初學者實踐步驟:

  1. 安裝FastAPI和Uvicorn
  2. 完成基礎示例(Hello World、路徑參數、查詢參數)
  3. 使用Pydantic模型處理數據驗證
  4. 嘗試編寫GET和POST接口,測試API文檔
  5. 用異步函數處理簡單耗時操作

進階方向:

  • 中間件(Middleware):處理所有請求/響應
  • 依賴注入(Dependency Injection):複用代碼邏輯
  • 數據庫集成(SQLAlchemy/FastAPI-SQLAlchemy)
  • 中間件和CORS配置(處理跨域請求)

FastAPI的學習曲線平緩,從基礎到進階可以逐步擴展,建議結合官方文檔和實際項目練習,很快就能上手!

小夜