iT邦幫忙

2025 iThome 鐵人賽

DAY 13
0
生成式 AI

一起來打造 PTT 文章智慧問答系統!系列 第 13

【Day 13】Django REST Framework 入門介紹 - 打造高彈性 RESTful API 的利器

  • 分享至 

  • xImage
  •  

Hi大家好,
這是我參加 iT 邦幫忙鐵人賽的第 1 次挑戰,這次的主題聚焦在結合 Python 爬蟲、RAG(檢索增強生成)與 AI,打造一套 PTT 文章智慧問答系統。在過程中,我會依照每天進度上傳程式碼到 GitHub ,方便大家參考學習。也歡迎留言或來信討論,我的信箱是 gerryearth@gmail.com


在進入專案 API 實作之前,我們先從整體架構與工具選型談起。
本篇將帶你快速認識 Django REST Framework(DRF),並說明它如何幫助我們在專案中,將爬蟲儲存的資料安全、穩定且高效地提供給前端、RAG 系統,以及統計服務使用。我們會從 REST API 的概念 開始,逐步介紹 DRF 的核心元件與設計理念,最後分享在本專案的應用規劃,為明天的 API 實作打下基礎。


今日目標

  • 了解什麼是 Django REST Framework(DRF)
  • 認識核心概念(Serializer、ViewSet、Router 等)
  • 探討為什麼選擇 DRF 作為本專案 API 架構
  • 本專案中 DRF 的應用規劃

為什麼需要 REST API?

在本專案中,我們的資料經過爬蟲儲存進 MariaDB,而這些資料會被下列用途取用:

  • 提供前端查詢介面(列表、條件搜尋、詳細內容)
  • 作為 RAG 系統的資料來源(語意檢索)
  • 提供統計或視覺化服務(例如:熱門作者排行)

因此,我們需要一個穩定且彈性強的 API 架構,而 Django REST Framework(DRF) 正好符合這樣的需求。


什麼是 REST API?

在介紹 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 REST Framework?

雖然 Django 原本就有處理資料的功能(如 View 和 Model),但當你要打造 API 時,會發現事情變得很複雜。

這時候 DRF 就派上用場了,它提供:

  • 序列化工具(Serializers):可以把資料模型轉成 JSON 格式,方便 API 傳送。
  • Class-Based View(CBV):用更簡潔的方式來寫 API 的邏輯。
  • 權限與認證系統:輕鬆控管誰能存取 API。
  • 自動產生的 API 文件頁面:讓你可以在網頁上測試 API,很方便。

什麼是 Django REST Framework?

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 的核心概念

來看看 DRF 的幾個重點元件:

1. Serializer(序列化器)

用來把 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']

2. API View(API 視圖)

這是用來處理 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)

3. Router(路由)

用 DRF 提供的 router 可以快速對應 URL 路徑,不用手動設定太多。

from rest_framework.routers import DefaultRouter
from .views import PostViewSet

router = DefaultRouter()
router.register(r'posts', PostViewSet)

本專案中 DRF 的應用規劃

我們預計會用 DRF 完成以下幾項 API 任務:

1. 查詢API (GET)

  • /api/posts/:回傳最新 50 筆文章,可透過 limitoffset 分頁,支援 發文者更新日期版面 查詢。
  • /api/posts/<id>/:查詢特定文章詳細內容。
  • /api/statistics/:查詢統計資訊(文章總數),可透過 時間範圍版面作者 過濾。

2. RAG 檢索 API (POST)

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,透過 limitoffset 分頁,支援 發文者更新日期版面 查詢!


上一篇
【Day 12】監控與除錯 - 記錄爬蟲執行 Log 並儲存至資料庫
系列文
一起來打造 PTT 文章智慧問答系統!13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言