Hi大家好,
這是我參加 iT 邦幫忙鐵人賽的第 1 次挑戰,這次的主題聚焦在結合 Python 爬蟲、RAG(檢索增強生成)與 AI,打造一套 PTT 文章智慧問答系統。在過程中,我會依照每天進度上傳程式碼到 GitHub ,方便大家參考學習。也歡迎留言或來信討論,我的信箱是 gerryearth@gmail.com。
在進入專案 API 實作之前,我們先從整體架構與工具選型談起。
本篇將帶你快速認識 Django REST Framework(DRF),並說明它如何幫助我們在專案中,將爬蟲儲存的資料安全、穩定且高效地提供給前端、RAG 系統,以及統計服務使用。我們會從 REST API 的概念 開始,逐步介紹 DRF 的核心元件與設計理念,最後分享在本專案的應用規劃,為明天的 API 實作打下基礎。
在本專案中,我們的資料經過爬蟲儲存進 MariaDB,而這些資料會被下列用途取用:
因此,我們需要一個穩定且彈性強的 API 架構,而 Django REST Framework(DRF) 正好符合這樣的需求。
在介紹 DRF 前,先簡單了解什麼是 REST API。
REST 是一種設計 API 的風格,它的核心是讓不同系統之間透過 HTTP 傳遞資料(通常是 JSON 格式)。
常見的 HTTP 方法對應的功能如下:
GET
:取得資料POST
:新增資料PUT
/ PATCH
:更新資料DELETE
:刪除資料舉例來說,如果你有一個「部落格文章」的資源,API 會長這樣:
GET /posts/
→ 取得所有文章GET /posts/1/
→ 取得第1篇文章POST /posts/
→ 新增一篇文章PUT /posts/1/
→ 更新第1篇文章DELETE /posts/1/
→ 刪除第1篇文章相關好文章: API 是什麼? RESTful API 又是什麼?
雖然 Django 原本就有處理資料的功能(如 View 和 Model),但當你要打造 API 時,會發現事情變得很複雜。
這時候 DRF 就派上用場了,它提供:
Django REST Framework(簡稱 DRF)是 Django 上最受歡迎的 API 開發工具集,能幫助我們快速建立 RESTful API。
DRF 提供了完整的功能組件,包括:
元件 | 說明 |
---|---|
Serializer | 將 Django Model 轉換為 JSON 格式,或處理輸入資料驗證 |
ViewSet | 將 GET / POST / PUT / DELETE 整合在一個類別中 |
Router | 自動產生 RESTful 的 URL 配置 |
Filter | 支援依欄位值過濾資料(如作者、看板) |
Search | 支援全文關鍵字查詢(如搜尋文章標題) |
Permission | 權限控管,支援驗證機制(JWT、Token 等) |
Browsable API | 提供可互動的 API UI,方便測試與開發 |
來看看 DRF 的幾個重點元件:
用來把 Django 的 Model 資料轉成 JSON,也能把 JSON 轉回 Python 資料。
from rest_framework import serializers
from .models import Post
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ['id', 'title', 'content']
這是用來處理 API 請求的地方。DRF 提供了多種寫法,像是:
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Post
from .serializers import PostSerializer
class PostList(APIView):
def get(self, request):
posts = Post.objects.all()
serializer = PostSerializer(posts, many=True)
return Response(serializer.data)
用 DRF 提供的 router 可以快速對應 URL 路徑,不用手動設定太多。
from rest_framework.routers import DefaultRouter
from .views import PostViewSet
router = DefaultRouter()
router.register(r'posts', PostViewSet)
我們預計會用 DRF 完成以下幾項 API 任務:
/api/posts/
:回傳最新 50 筆文章,可透過 limit
、offset
分頁,支援 發文者
、更新日期
、版面
查詢。/api/posts/<id>/
:查詢特定文章詳細內容。/api/statistics/
:查詢統計資訊(文章總數),可透過 時間範圍
、版面
、作者
過濾。POST /api/search/
{
"question": "請問最近台股有什麼影響市場的消息?",
"top_k": 3
}
回應範例
{
"question": "請問最近台股有什麼影響市場的消息?",
"answer": "根據最近 PTT 討論,台股受到美國總統川普宣布半導體關稅的影響,...",
"related_articles": [
{
"id": 164,
"board": "Stock",
"author": "enouch777",
"title": "[新聞] 英媒:北京握有3張底牌 抵禦川普關稅",
"content": "原文標題:英媒:...",
"post_time": "2025-04-15T17:34:11+08:00",
"url": "https://www.ptt.cc/bbs/Stock/M.1744709653.A.52A.html"
},
{
"id": 818,
"board": "Gossiping",
"author": "v40316",
"title": "[問卦] 還沒等到川普扣訊…",
"content": "表定今天...",
"post_time": "2025-04-17T02:12:22+08:00",
"url": "https://www.ptt.cc/bbs/Gossiping/M.1744827144.A.9BE.html"
},
{
"id": 833,
"board": "Stock",
"author": "NowQmmmmmmmm",
"title": "[情報] 聯準會主席鮑威爾今夜談話內容整理",
"content": "繼續無視川普!...",
"post_time": "2025-04-17T03:31:24+08:00",
"url": "https://www.ptt.cc/bbs/Stock/M.1744831887.A.C63.html"
}
]
}
明天【Day 14】實作文章 API:列表、篩選、查詢
我們將建立第一組 /api/posts/
的 API,透過 limit
、offset
分頁,支援 發文者
、更新日期
、版面
查詢!