本教程从零开始,带你构建一个专业可上线的 RESTful API ,涵盖 DRF
的核心功能:
Model → Serializer → APIView → GenericAPIView → ViewSet → JWT → 权限 →
分页 → 过滤 → 异常处理
非常适合 Django + SimpleJWT 的后端项目。
📌 目录
- 环境准备
- 创建 Django 项目
- 编写 Model
- Serializer(序列化器)
- APIView(基础)
- GenericAPIView + Mixins
- ViewSet + Router(企业最佳实践)
- 分页
- 过滤 / 搜索 / 排序
- 权限
- 认证(JWT)
- 全局异常处理
- 完整 RESTful API 示例
1️⃣ 安装 DRF
bash
pip install djangorestframework
修改 settings.py:
python
INSTALLED_APPS = [
...
'rest_framework',
]
2️⃣ 创建项目与 App
bash
django-admin startproject myapi
cd myapi
python manage.py startapp users
3️⃣ Model(资源)
users/models.py:
python
from django.db import models
class User(models.Model):
username = models.CharField(max_length=32)
email = models.EmailField()
created_at = models.DateTimeField(auto_now_add=True)
4️⃣ Serializer(核心)
users/serializers.py:
python
from rest_framework import serializers
from .models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = "__all__"
Serializer = Python对象 ↔ JSON 的转换器,是 DRF 的灵魂。
5️⃣ APIView(最基础的 RESTful)
users/views.py:
python
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import User
from .serializers import UserSerializer
class UserListCreateView(APIView):
def get(self, request):
users = User.objects.all()
serializer = UserSerializer(users, many=True)
return Response(serializer.data)
def post(self, request):
serializer = UserSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
URL:
python
path("users/", UserListCreateView.as_view()),
6️⃣ GenericAPIView + Mixins(更 RESTful)
python
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
from .models import User
from .serializers import UserSerializer
class UserListCreateView(ListCreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
class UserDetailView(RetrieveUpdateDestroyAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
URL:
python
path("users/", UserListCreateView.as_view()),
path("users/<int:pk>/", UserDetailView.as_view()),
RESTful API:
方法 URL 说明
GET /users/ 获取用户列表
POST /users/ 创建
GET /users/1/ 详情
PUT /users/1/ 修改
DELETE /users/1/ 删除
7️⃣ ViewSet + Router(企业最常用)
python
from rest_framework.viewsets import ModelViewSet
class UserViewSet(ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
urls.py:
python
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register("users", UserViewSet)
urlpatterns = router.urls
自动生成:
GET /users/
POST /users/
GET /users/{id}/
PUT /users/{id}/
PATCH /users/{id}/
DELETE /users/{id}/
企业 95% 采用 ViewSet。
8️⃣ 分页 Pagination
settings.py:
python
REST_FRAMEWORK = {
"DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination",
"PAGE_SIZE": 10
}
示例:
GET /users/?page=2
9️⃣ 过滤 / 搜索 / 排序
安装:
bash
pip install django-filter
settings.py:
python
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': [
'django_filters.rest_framework.DjangoFilterBackend',
'rest_framework.filters.SearchFilter',
'rest_framework.filters.OrderingFilter',
]
}
启用:
python
class UserViewSet(ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
filterset_fields = ["username"]
search_fields = ["username", "email"]
ordering_fields = ["created_at"]
🔟 权限(Permissions)
全局:
python
REST_FRAMEWORK = {
"DEFAULT_PERMISSION_CLASSES": ["rest_framework.permissions.IsAuthenticated"],
}
局部:
python
permission_classes = [IsAuthenticated]
自定义权限:
python
class IsAdmin(BasePermission):
def has_permission(self, request, view):
return request.user.is_staff
1️⃣1️⃣ 认证(Authentication) + JWT 登录
安装:
bash
pip install djangorestframework-simplejwt
设置:
python
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": [
"rest_framework_simplejwt.authentication.JWTAuthentication",
]
}
路由:
python
path("token/", TokenObtainPairView.as_view()),
path("token/refresh/", TokenRefreshView.as_view()),
请求示例:
Authorization: Bearer <access_token>
1️⃣2️⃣ 全局异常处理
settings.py:
python
REST_FRAMEWORK = {
"EXCEPTION_HANDLER": "utils.exceptions.custom_handler"
}
utils/exceptions.py:
python
from rest_framework.views import exception_handler
def custom_handler(exc, context):
response = exception_handler(exc, context)
if response:
response.data = {
"code": response.status_code,
"message": response.data,
"data": None
}
return response
1️⃣3️⃣ 最终 RESTful API 结构示例
GET /api/v1/users/
POST /api/v1/users/
GET /api/v1/users/<id>/
PATCH /api/v1/users/<id>/
DELETE /api/v1/users/<id>/
统一响应格式:
json
{
"code": 0,
"message": "success",
"data": { ... }
}