學習LLM大語言模型之路(六) - FastAPI 深入解析與實戰(1) : Starlette

更新 發佈閱讀 16 分鐘

FastAPI 是一個基於 Python 3.7+ 的 高效能 Web 框架,其特點是:

  • 超高速(基於 Starlette + Pydantic)
  • 自動產生 Swagger API 文件
  • 嚴謹的資料驗證與型別檢查
  • 原生支援非同步(async / await)

在 AI / LLM 應用中,它特別適合用於建立高效能、可擴充的 API

FastAPI 架構概念

FastAPI 建構於以下兩個核心元件:

  • Starlette:提供非同步 Web 框架基礎(路由、請求/回應、背景任務、WebSocket )
  • Pydantic:用來處理資料驗證、序列化與型別安全的模型管理

Starlette 是什麼?

Starlette 是一個「輕量級、非同步、現代化」的 ASGI Web 框架,它提供:

raw-image

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 提供精簡卻強大的 RequestResponse 類別,支援非同步與同步資料解析。

🔎 請求物件 Request

from starlette.requests import Request

async def echo(request: Request):
data = await request.json()
return JSONResponse({"received": data})

支援的請求內容:

  • await request.body():原始 body
  • await 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 + 請求驗證 + 背景任務 + 中介層 + 單元測試 的小專案。

raw-image

📁 專案結構

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/

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

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

背景任務:寫入messages.log

背景任務:寫入messages.log

總結學到的觀念

raw-image

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


留言
avatar-img
留言分享你的想法!
avatar-img
宅D嘉的開發人生
21會員
50內容數
加密貨幣很有趣,遊戲開發也很有趣,AI也有點意思,身為一個跨多領域的軟體工程師,喜歡研究新鮮的事物,歡迎來到我的世界,一起坐上這艘開往未來探索新奇的列車。
宅D嘉的開發人生的其他內容
2025/06/07
目標 ✅ 建立 FastAPI API,讓應用可以透過 REST API 進行 LLM 查詢 ✅ 結合 RAG 技術,提高 LLM 回應的準確度 ✅ 存入及查詢 FAISS 向量資料庫,讓 LLM 檢索外部知識庫
Thumbnail
2025/06/07
目標 ✅ 建立 FastAPI API,讓應用可以透過 REST API 進行 LLM 查詢 ✅ 結合 RAG 技術,提高 LLM 回應的準確度 ✅ 存入及查詢 FAISS 向量資料庫,讓 LLM 檢索外部知識庫
Thumbnail
2025/05/31
AI幻覺(AI Hallucination)是指人工智慧(AI)生成的內容包含錯誤、不準確或完全虛構的資訊,但卻表現得像是真實可靠的答案。這種現象通常發生在大型語言模型(LLM)或其他生成式AI系統中,並可能導致誤導性的結果。
2025/05/31
AI幻覺(AI Hallucination)是指人工智慧(AI)生成的內容包含錯誤、不準確或完全虛構的資訊,但卻表現得像是真實可靠的答案。這種現象通常發生在大型語言模型(LLM)或其他生成式AI系統中,並可能導致誤導性的結果。
2025/05/24
本篇探討 Prompt Engineering 的策略與應用,並介紹一個 Prompt Engineering 實驗平臺專案,平臺允許使用者輸入任務敘述、選擇風格和提示策略,比較不同 Prompt 的回應結果,有助於學習如何設計 Prompt 模板來影響 LLM 行為及比較不同提示策略對結果的影響。
Thumbnail
2025/05/24
本篇探討 Prompt Engineering 的策略與應用,並介紹一個 Prompt Engineering 實驗平臺專案,平臺允許使用者輸入任務敘述、選擇風格和提示策略,比較不同 Prompt 的回應結果,有助於學習如何設計 Prompt 模板來影響 LLM 行為及比較不同提示策略對結果的影響。
Thumbnail
看更多
你可能也想看
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
※ 什麼是Web API API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。 API流程: 終端使用者用任何一種裝置進入瀏覽器。 瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。 後端透過 API 收到前端的請求後,取得資料並回應給前端。 前端渲染畫面,終端使用者
Thumbnail
※ 什麼是Web API API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。 API流程: 終端使用者用任何一種裝置進入瀏覽器。 瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。 後端透過 API 收到前端的請求後,取得資料並回應給前端。 前端渲染畫面,終端使用者
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 以下陳述任務 (Task)、模型 (Model)、微調 (Fine-Tuning)、GLUE (General Language Understanding Evalu
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 以下陳述任務 (Task)、模型 (Model)、微調 (Fine-Tuning)、GLUE (General Language Understanding Evalu
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 我們已經在AI說書 - 從0開始 - 32中,展示了OpenAI的API如何使用,儘管 API 可以滿足許多需求,但它們也有其限制,例如,多用途 API 可能在所有任務
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 我們已經在AI說書 - 從0開始 - 32中,展示了OpenAI的API如何使用,儘管 API 可以滿足許多需求,但它們也有其限制,例如,多用途 API 可能在所有任務
Thumbnail
Python是一種易學且功能強大的程式語言,具有直譯、動態語法等特性,並擁有豐富的標準庫。它在各領域如Web開發、數據科學和人工智慧等得到廣泛應用,並被許多大公司如Google和Facebook等使用。Python還有強大的框架、豐富的交互機能、和龐大的社區。
Thumbnail
Python是一種易學且功能強大的程式語言,具有直譯、動態語法等特性,並擁有豐富的標準庫。它在各領域如Web開發、數據科學和人工智慧等得到廣泛應用,並被許多大公司如Google和Facebook等使用。Python還有強大的框架、豐富的交互機能、和龐大的社區。
Thumbnail
你知道IG是用Django開發的嗎? 正在學習或使用Django、Flask框架開發後端的你,是否也常在享受Python語法的舒適之餘,仍然煩惱著是否該學習效率更好的GO或Laravel。
Thumbnail
你知道IG是用Django開發的嗎? 正在學習或使用Django、Flask框架開發後端的你,是否也常在享受Python語法的舒適之餘,仍然煩惱著是否該學習效率更好的GO或Laravel。
Thumbnail
我們在「【🔒 Python API框架篇 - FastAPI】Ep.1 啟航」有分享 FastAPI 這套API框架, 那麼當我們想要在應用程式剛執行時就註冊一些事件或者共享GPU運算模型、變數…等,當整個應用程式關閉時也進行釋放作業, 這樣的一個週期循環就是所謂的生命週期, 而在FastAPI這
Thumbnail
我們在「【🔒 Python API框架篇 - FastAPI】Ep.1 啟航」有分享 FastAPI 這套API框架, 那麼當我們想要在應用程式剛執行時就註冊一些事件或者共享GPU運算模型、變數…等,當整個應用程式關閉時也進行釋放作業, 這樣的一個週期循環就是所謂的生命週期, 而在FastAPI這
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News