Q:如果功能要做成API你會建議怎麼開始?
A:
先想清楚要提供什麼服務
• 功能的核心是什麼?(例如:付款請求、查詢帳單、產生 token…)
• 這個 API 給誰用?(前端、第三方、內部服務)
• 輸入跟輸出長什麼樣子?(例如接收 JSON,回傳 JSON)
選框架
因為你在練習 Django + DRF (Django REST Framework),很適合用來開 API。
寫 serializer & view
例如一個付款請求 API:
設URL
測試
用 pytest-django 或 DRF test client 去測
Q:寫 serializer & view?
A:
為什麼要有 serializer?
• API 收到的資料通常是 JSON(例如前端送 {"amount":500,"currency":"TWD"})。
• Django/DRF 需要把這些 JSON → Python 物件 → 驗證正確性。
• 同樣地,回傳時 Python 物件也要轉回 JSON。
👉 這個轉換/驗證工作就是 serializer。
為什麼要有 view?
• view 就是 API 的入口。
• API 收到 request → 丟給 serializer 驗證 → 執行邏輯 → 回傳 Response。
Q:把這些給我一個圖示
A:
[使用者 / 前端]
│ (送出 JSON 請求)
▼
┌───────────────┐
│ API View │ ← Django REST Framework
└───────────────┘
│ (把資料丟給)
▼
┌───────────────┐
│ Serializer │ ← 驗證 & 格式化資料
└───────────────┘
│ 驗證成功?
┌─────┴──────┐
│ │
YES NO
│ │
▼ ▼
處理付款邏輯 回傳錯誤
│ │
▼ ▼
回傳成功 JSON {"error": "..."}
(含 transaction_id)
Q:DRF (Django REST Framework),可以發揮什麼功能?
A:
Django REST Framework (DRF) 是 Django 裡最常用來做 API 的工具包。它幫你把 Django 變成一個「API 工廠」,少掉很多重複工作。
DRF 可以發揮的主要功能
⸻
⸻
⸻
⸻
⸻
⸻
⸻
Q:給我一個示意圖看看吧!
A:
[ 使用者 / 前端 / App ]
│ (送出 HTTP 請求: JSON / GET / POST ...)
▼
┌───────────────────────────┐
│ Django REST Framework (DRF)│
└───────────────────────────┘
│
▼
┌──────────────┐
│ 路由 (urls) │ ← 決定進哪個 API endpoint
└──────────────┘
│
▼
┌──────────────┐
│ View(ViewSet, APIView) │ ← 控制流程
└──────────────┘
│
▼
┌──────────────┐
│ 驗證 (Authentication) │ ← Token / JWT / Session
└──────────────┘
│
▼
┌──────────────┐
│ 權限 (Permissions) │ ← IsAuthenticated / IsAdmin...
└──────────────┘
│
▼
┌──────────────┐
│ 序列化器 (Serializer) │ ← 驗證資料格式 & 轉換 JSON ↔ Python
└──────────────┘
│
▼
┌──────────────┐
│ 商業邏輯 (處理付款/查資料...) │
└──────────────┘
│
▼
┌──────────────┐
│ Response │ ← 自動處理 HTTP 狀態碼 & 格式
│ (JSON / XML...) │
└──────────────┘
│
▼
[ 使用者收到標準化回應 ]
Q:Authentication 如果我系統已經有驗證機制 可以套用?
A:
完全可以!💡 這正是 DRF 的強項之一:它的 Authentication 系統是「可插拔的 (pluggable)」,你可以直接套用你現有的驗證機制,或自訂一個。
• 已經有登入系統 (Django Session) → 用 SessionAuthentication
• 已有 Token 機制 → 用 TokenAuthentication
• 自訂/第三方驗證 → 自寫一個 BaseAuthentication 類別
這樣問下來,目前要做什麼似乎django都可以做到啊!!