Django REST Framework(DRF)RESTful 最完整版实战教程

本教程从零开始,带你构建一个专业可上线的 RESTful API ,涵盖 DRF

的核心功能:
Model → Serializer → APIView → GenericAPIView → ViewSet → JWT → 权限 →
分页 → 过滤 → 异常处理

非常适合 Django + SimpleJWT 的后端项目。


📌 目录

  1. 环境准备
  2. 创建 Django 项目
  3. 编写 Model
  4. Serializer(序列化器)
  5. APIView(基础)
  6. GenericAPIView + Mixins
  7. ViewSet + Router(企业最佳实践)
  8. 分页
  9. 过滤 / 搜索 / 排序
  10. 权限
  11. 认证(JWT)
  12. 全局异常处理
  13. 完整 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": { ... }
}

🎉 你已经掌握 DRF 最完整的 RESTful 实战流程!

相关推荐
AI Echoes14 小时前
LangChain 非分割类型的文档转换器使用技巧
人工智能·python·langchain·prompt·agent
程序之巅14 小时前
VS code 远程python代码debug
android·java·python
__如风__14 小时前
onlyoffice文档转换服务离线部署
python
今晚务必早点睡14 小时前
写一个Python接口:发送支付成功短信
开发语言·python
ada7_15 小时前
LeetCode(python)22.括号生成
开发语言·数据结构·python·算法·leetcode·职场和发展
2501_9418714515 小时前
面向微服务链路追踪与全局上下文管理的互联网系统可观测性设计与多语言工程实践分享
大数据·数据库·python
luoluoal15 小时前
基于python的语音和背景音乐分离算法及系统(源码+文档)
python·mysql·django·毕业设计·源码
love530love15 小时前
EPGF 新手教程 12在 PyCharm(中文版 GUI)中创建 Poetry 项目环境,并把 Poetry 做成“项目自包含”(工具本地化为必做环节)
开发语言·ide·人工智能·windows·python·pycharm·epgf
cute_ming15 小时前
从 Node.js + TypeScript 无缝切换到 Python 的最佳实践
python·typescript·node.js
2501_9418705615 小时前
从配置频繁变动到动态配置体系落地的互联网系统工程实践随笔与多语言语法思考
java·前端·python