Django Rest Framework (DRF) 新手指南:為什麼選擇 DRF 建構 API?
更新日期: 2025 年 1 月 29 日
本文為 Django 登入註冊功能(後端)系列文,第 2 篇
- 新手指南|使用 Django 實現後端會員登入、註冊功能
- Django Rest Framework (DRF) 新手指南:為什麼選擇 DRF 建構 API? 👈所在位置
- Django Rest Framework (DRF) 新手指南:用 ViewSets 快速構建 CRUD API
- 初學者指南:理解 Token 認證及其運作方式
- Django REST Framework (DRF) 認證方式、預設權限規則|新手指南
- Django Rest Framework 入門指南:如何正確處理 HTTP 狀態碼
- 初學者指南:深入了解 Django 的 create_user 方法
- 新手指南:深入了解 Django 的 authenticate 方法
- Django REST Framework|@permission_classes指導手冊
- 使用 Postman 測試 Django 後端的註冊、登入與登出功能
在現代 Web 開發中,前後端分離已成為主流。
這種開發模式要求後端提供 API,前端負責渲染頁面和處理資料互動。
Django 作為一個強大的 Web 框架,本身已支援構建 API,例如返回 JSON 資料。
但如果希望簡化開發過程並實現功能強大、結構清晰的 RESTful API,Django Rest Framework (DRF) 是不可或缺的工具。
本篇文章將幫助您了解 DRF 的好處、與手寫 API 的差異,以及為什麼推薦在前後端分離時使用它。
Django 支援前後端分離嗎?
是的,Django 支援前後端分離。
即使不使用 DRF,Django 也能處理 HTTP 請求並返回 JSON 資料作為 API。
以下是一個基於 Django 的基本登入 API 範例,使用 JsonResponse:
不使用 DRF 建立 API 的範例
以下程式碼展示如何手寫一個簡單的登入功能:
# views.py
from django.http import JsonResponse
from django.contrib.auth import authenticate
import json
def login_view(request):
if request.method == 'POST':
data = json.loads(request.body)
username = data.get('username')
password = data.get('password')
user = authenticate(username=username, password=password)
if user:
return JsonResponse({'message': '登入成功!'}, status=200)
else:
return JsonResponse({'error': '登入失敗!'}, status=401)
return JsonResponse({'error': '只接受 POST 請求'}, status=405)
雖然這樣的實現可以完成基本需求,但存在以下缺點:
缺點
- 手動處理序列化:需要自行撰寫邏輯來將資料轉換為 JSON 格式。
- 功能缺失:像分頁、權限控制和資料驗證等進階功能都需要自行實現。
- 難以維護:隨著 API 增加,手寫的程式碼可能變得混亂且重複性高。
補充:什麼是序列化
序列化 (Serialization) 是指將資料轉換為某種格式,以便儲存或傳輸的過程。
在 Web 開發中,序列化通常是將伺服器中的資料(例如資料庫中的資料)轉換為 JSON 格式,以便傳送到前端使用。
反之,當前端將 JSON 格式的資料發送到後端時,後端需要將 JSON 資料「反序列化 (Deserialization)」,轉換回伺服器可用的資料格式(例如 Django 的模型實例)。
舉個例子來理解
假設你的後端有以下資料表(模型):
# models.py from django.db import models class User(models.Model): username = models.CharField(max_length=100) email = models.EmailField() age = models.IntegerField()資料表中存有一筆資料:
ID Username Age 1 testuser [email protected] 25 場景:後端將資料傳送到前端
前端無法直接讀取 Django 的模型實例,因此需要把這筆資料轉換成 JSON 格式,例如:
{ "id": 1, "username": "testuser", "email": "[email protected]", "age": 25 }這就是 序列化 的過程。
場景:前端將資料發送到後端
如果前端發送了以下 JSON 請求,要求新增一個用戶:
{ "username": "newuser", "email": "[email protected]", "age": 30 }後端需要把這些 JSON 資料轉換為 Django 的模型實例,以便儲存到資料庫中。這就是 反序列化 的過程。
使用 DRF 的好處
為了解決上述問題,Django Rest Framework (DRF) 提供了許多現成工具,可以顯著簡化開發過程。
如果將上述的登入功能代碼用 Django Rest Framework (DRF) 改寫,可以利用 DRF 的內建功能,例如 序列化、驗證 和 裝飾器,讓程式碼更清晰、更結構化。
以下是改寫後的範例:
使用 DRF 改寫的代碼
# views.py
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from rest_framework import status
from django.contrib.auth import authenticate
@api_view(['POST']) # 限制只接受 POST 請求
@permission_classes([AllowAny]) # 允許所有用戶訪問此 API(即使未登入)
def login_view(request):
# 從請求中提取資料
username = request.data.get('username')
password = request.data.get('password')
# 驗證用戶
user = authenticate(username=username, password=password)
if user:
return Response({'message': '登入成功!'}, status=status.HTTP_200_OK)
else:
return Response({'error': '登入失敗!'}, status=status.HTTP_401_UNAUTHORIZED)
關鍵差異與改寫優勢
使用 @api_view 裝飾器
DRF 提供的 @api_view 裝飾器讓我們可以輕鬆處理 HTTP 方法,例如只允許 POST,避免手動檢查 request.method。
簡化請求處理
在 DRF 中,request.data 自動解析 JSON 請求內容,無需手動使用 json.loads 處理 request.body。
內建狀態碼支援
DRF 提供的 rest_framework.status 模組內建常見的 HTTP 狀態碼,例如 HTTP_200_OK 和 HTTP_401_UNAUTHORIZED,讓代碼更易讀。
更靈活的權限控制
利用 @permission_classes,可以輕鬆設置 API 的訪問權限,例如允許所有用戶(未登入用戶也能訪問),或者僅允許已登入用戶。
核心優勢
簡化的序列化
DRF 提供了 Serializer 工具,能夠快速將 Django 模型轉換為 JSON,或者將 JSON 資料轉換為模型物件。您不需要手動處理序列化邏輯。
範例:序列化 Django 的 User 模型
from rest_framework import serializers
from django.contrib.auth.models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'username', 'email']
快速構建 CRUD API
DRF 提供了通用的 視圖類 (Generic Views) 和 視圖集 (ViewSets),讓您能夠輕鬆構建增刪改查 (CRUD) 功能,並自動處理許多常見的細節。
範例:使用 DRF 建立簡單的 CRUD API
from rest_framework.viewsets import ModelViewSet
from .models import MyModel
from .serializers import MyModelSerializer
class MyModelViewSet(ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
上述程式碼自動生成以下 API 功能:
GET /mymodel/:列出所有資料POST /mymodel/:新增資料GET /mymodel/<id>/:取得單筆資料PUT /mymodel/<id>/:更新資料DELETE /mymodel/<id>/:刪除資料
內建功能豐富
DRF 提供了許多開箱即用的功能:
- 分頁 (Pagination):自動分頁處理。
- 篩選與搜尋 (Filtering and Searching):支援 URL 查詢參數篩選資料。
- 權限控制 (Permissions):輕鬆設定 API 的存取規則。
- 驗證 (Validation):自動驗證輸入資料是否符合要求。
支援多種認證方式
DRF 支援多種認證方式,包括:
- Token 認證
- Session 認證
- JWT 認證(透過擴展)
- OAuth 認證
直觀的瀏覽器 API
DRF 提供了一個可瀏覽的 API 界面,方便您在瀏覽器中測試 API,無需額外工具。
高度擴展性
DRF 幾乎所有功能(例如序列化、權限、認證)都可以自定義,滿足您的特殊業務需求。
使用 DRF 與不用 DRF 的差異比較
以下表格展示使用 DRF 與手寫 API 的關鍵差異:
| 功能 | 不使用 DRF | 使用 DRF |
|---|---|---|
| 序列化 | 手動撰寫 JSON 序列化邏輯 | 使用 Serializer 自動處理 |
| CRUD 操作 | 每個 API 需手動撰寫 | 使用 Generic Views 或 ViewSet 快速生成 |
| 分頁與篩選 | 必須自行開發 | 提供內建功能 |
| 認證與權限 | 自行設計認證機制 | 多種認證方式開箱即用 |
| 開發速度 | 較慢,程式碼重複性高 | 快速開發,程式碼簡潔 |
| API 界面 | 無內建界面,需額外工具測試 | 自動生成可瀏覽的 API 界面 |
什麼情況下可以不用 DRF?
雖然 DRF 功能強大,但在某些情況下,您可能選擇不使用它:
- 簡單的專案:如果專案只有少量 API,並且功能非常簡單,例如只需返回靜態 JSON 資料。
- 高度自定義需求:當 API 的行為與 DRF 提供的通用工具完全不同時,可能需要自行手寫邏輯。
- 學習 Django 的基礎:若您是新手,希望深入了解 Django 的底層實現,建議先手動撰寫 API,熟悉基本的 HTTP 處理流程。
結論:為什麼推薦 DRF?
Django Rest Framework (DRF) 是為構建 RESTful API 而生的強大工具。它透過標準化的設計和豐富的功能,讓 API 開發變得快速且高效。以下是選擇 DRF 的主要原因:
- 簡化了繁瑣的序列化和驗證工作。
- 支援多種認證方式和權限控制。
- 自動生成可瀏覽的 API 界面,方便開發與測試。
- 特別適合中大型專案,或需要構建多個 API 端點的情況。
如果您的專案需要支援前後端分離,DRF 是不可或缺的工具。試試看,讓它成為您開發工具箱中的一員吧!
