FastAPI 是一個基於 Python 3.7+ 的 高效能 Web 框架,其特點是:
- 超高速(基於 Starlette + Pydantic)
- 自動產生 Swagger API 文件
- 嚴謹的資料驗證與型別檢查
- 原生支援非同步(async / await)
在 AI / LLM 應用中,它特別適合用於建立高效能、可擴充的 API。
FastAPI 架構概念
FastAPI 建構於以下兩個核心元件:- Starlette:提供非同步 Web 框架基礎(路由、請求/回應、背景任務、WebSocket )
- Pydantic:用來處理資料驗證、序列化與型別安全的模型管理
Starlette 是什麼?
Starlette 是一個「輕量級、非同步、現代化」的 ASGI Web 框架,它提供:

FastAPI 就是將 Starlette「包裝 + 擴充」,變成更完整的 API 框架。
1. 路由處理(Routing)
Starlette 提供簡單而強大的路由系統,可處理不同 HTTP 方法與 URL 路徑。
路由基本用法
from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route
async def homepage(request):
return JSONResponse({"message": "Hello, Starlette!"})
async def hello(request):
name = request.path_params["name"]
return JSONResponse({"hello": name})
routes = [
Route("/", endpoint=homepage),
Route("/hello/{name}", endpoint=hello)
]
app = Starlette(debug=True, routes=routes)
支援的方法
可以在 Route(..., methods=["GET", "POST"])
指定 HTTP 方法。
2. 請求 / 回應處理(Request & Response)
Starlette 提供精簡卻強大的 Request
與 Response
類別,支援非同步與同步資料解析。
🔎 請求物件 Request
from starlette.requests import Request
async def echo(request: Request):
data = await request.json()
return JSONResponse({"received": data})
支援的請求內容:
await request.body()
:原始 bodyawait request.json()
:JSON 物件await request.form()
:表單資料request.headers
:標頭request.query_params
:查詢參數
回應物件 Response
內建多種回應類型:
from starlette.responses import JSONResponse, PlainTextResponse, RedirectResponse
return JSONResponse({"result": "ok"})
return PlainTextResponse("hello", status_code=201)
return RedirectResponse(url="/")
3. 背景任務(Background Tasks)
背景任務可以在回應後「非同步執行」其他工作,例如寄信、通知、寫入 log。
使用方式
from starlette.background import BackgroundTask
from starlette.responses import JSONResponse
def write_log():
print("記錄背景 log 完成")
async def endpoint(request):
return JSONResponse(
{"status": "success"},
background=BackgroundTask(write_log)
)
也支援有參數的背景任務:
def send_email(user_email: str):
print(f"寄出 email 給 {user_email}")
BackgroundTask(send_email, "test@example.com")
4. 測試工具(Test Client)
Starlette 提供與 FastAPI 相容的 測試工具,可模擬 HTTP 請求進行單元測試。
用法範例
from starlette.testclient import TestClient
client = TestClient(app)
def test_homepage():
response = client.get("/")
assert response.status_code == 200
assert response.json() == {"message": "Hello, Starlette!"}
Middleware 支援
Starlette 支援 Middleware,像是日誌記錄、認證、Header 增加等:
from starlette.middleware.base import BaseHTTPMiddleware
class CustomHeaderMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
response = await call_next(request)
response.headers["X-Powered-By"] = "Starlette"
return response
app.add_middleware(CustomHeaderMiddleware)
實戰
打造一個具備 RESTful API + 請求驗證 + 背景任務 + 中介層 + 單元測試 的小專案。

📁 專案結構
mini_api/
├── main.py # 主應用程式
├── models.py # Pydantic 模型
├── middleware.py # 自訂中介層
├── test_main.py # 單元測試
├── requirements.txt # 套件
1️⃣ models.py — 請求驗證資料模型
from pydantic import BaseModel, EmailStr
class Contact(BaseModel):
name: str
email: EmailStr
message: str
2️⃣ middleware.py — 自訂中介層
from starlette.middleware.base import BaseHTTPMiddleware
class LoggingMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
print(f"[📥] {request.method} {request.url}")
response = await call_next(request)
print(f"[📤] Status: {response.status_code}")
return response
3️⃣ main.py — 主應用程式
from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route
from starlette.background import BackgroundTask
from starlette.requests import Request
from starlette.middleware import Middleware
from starlette.exceptions import HTTPException
from starlette.status import HTTP_400_BAD_REQUEST
from models import Contact
from middleware import LoggingMiddleware
import json
# 📨 背景任務函數
def save_message(contact: Contact):
with open("messages.log", "a") as f:
f.write(contact.json() + "\n")
# 📩 送出表單 API
async def contact_endpoint(request: Request):
try:
data = await request.json()
contact = Contact(**data)
except Exception as e:
raise HTTPException(status_code=HTTP_400_BAD_REQUEST, detail="Invalid JSON or schema.")
task = BackgroundTask(save_message, contact)
return JSONResponse(
{"message": f"Hello {contact.name}, your message was received."},
background=task
)
# 🏠 首頁
async def home(request):
return JSONResponse({"message": "Welcome to mini Starlette API"})
# 全域路由設定
routes = [
Route("/", home, methods=["POST"]),
Route("/contact", contact_endpoint, methods=["POST"])
]
# 加入 middleware
middleware = [
Middleware(LoggingMiddleware)
]
app = Starlette(debug=True, routes=routes, middleware=middleware)
4️⃣ test_main.py — 單元測試
from starlette.testclient import TestClient
from main import app
client = TestClient(app)
def test_home():
res = client.get("/")
assert res.status_code == 200
assert res.json() == {"message": "Welcome to mini Starlette API"}
def test_valid_contact():
payload = {"name": "Alice", "email": "alice@example.com", "message": "Hi!"}
res = client.post("/contact", json=payload)
assert res.status_code == 200
assert "your message was received" in res.json()["message"]
def test_invalid_contact():
res = client.post("/contact", json={"name": "Bob", "message": "Missing email"})
assert res.status_code == 400
requirements.txt
starlette
pydantic[email]
httpx
▶️ 執行與測試
1.建立虛擬環境(建議):
python -m venv venv
venv\Scripts\Activate.ps1
2.安裝相依套件:
pip install -r requirements.txt
3.啟動伺服器
uvicorn main:app --reload
Postman執行

Postman呼叫http://127.0.0.1:8000/

Postman呼叫http://127.0.0.1:8000/contact

背景任務:寫入messages.log
總結學到的觀念

此篇了解了FastAPI最核心的兩大元件:Starlette、Pydantic之一的Starlette,Starlette做為一個輕量化非同步的ASGI Web框架(Asynchronous Server Gateway Interface)非同步伺服器閘道介面,包含了web所需的相關功能(路由處理、請求回應、背景任務、測試工具),是個很完整的web框架,下一篇來了解另外一個元件Pydantic。