Django REST Framework 简介 #

一、什么是Django REST Framework #

Django REST Framework(简称DRF)是一个强大且灵活的工具包,用于构建Web API。它基于Django构建,让开发者能够快速构建RESTful API。

1.1 核心定位 #

text
DRF = Django + RESTful API + 开发者友好

DRF的核心设计理念:

  • Web浏览API:提供可视化的API浏览界面
  • 认证系统:完善的认证和权限控制
  • 序列化:强大的数据序列化系统
  • 文档完善:详尽的官方文档和社区支持

1.2 核心特点 #

特点 说明
可视化API 内置Web浏览API界面,方便调试
认证系统 OAuth1、OAuth2、JWT等多种认证方式
序列化 支持ORM和非ORM数据源的序列化
分页 多种分页方式开箱即用
文档 自动生成API文档
浏览器测试 可直接在浏览器中测试API

二、为什么选择DRF #

2.1 与Django的关系 #

DRF与Django的关系:

text
┌─────────────────────────────────────┐
│           Django Web框架            │
├─────────────────────────────────────┤
│  - ORM数据库操作                     │
│  - 用户认证系统                      │
│  - Admin后台管理                     │
│  - URL路由系统                       │
└─────────────────────────────────────┘
                  │
                  ▼
┌─────────────────────────────────────┐
│      Django REST Framework          │
├─────────────────────────────────────┤
│  - 序列化器(Serializer)            │
│  - 视图集(ViewSet)                 │
│  - 路由器(Router)                  │
│  - 认证与权限                        │
│  - 分页系统                          │
│  - API文档                          │
└─────────────────────────────────────┘

2.2 DRF的优势 #

1. 开发效率高

python
from rest_framework import viewsets
from .models import Article
from .serializers import ArticleSerializer

class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

几行代码就能实现完整的CRUD API!

2. 内置可视化界面

访问API时自动返回美观的HTML页面:

text
GET /api/articles/

HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "count": 100,
    "next": "http://api.example.com/articles/?page=2",
    "previous": null,
    "results": [...]
}

3. 完善的认证系统

python
# settings.py
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
}

2.3 与其他框架对比 #

特性 DRF Flask-RESTful FastAPI
学习曲线 中等 简单 中等
内置功能 丰富 基础 丰富
ORM集成 Django ORM 需手动 SQLAlchemy
API文档 自动生成 需插件 自动生成
认证系统 完善 需手动 需手动
性能 中等 中等
类型提示 可选 必须

三、核心概念 #

3.1 序列化器(Serializer) #

序列化器是DRF的核心,负责复杂数据类型与Python数据类型之间的转换:

python
from rest_framework import serializers

class ArticleSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    title = serializers.CharField(max_length=200)
    content = serializers.CharField()
    author = serializers.CharField(max_length=100)
    created_at = serializers.DateTimeField(read_only=True)

    def create(self, validated_data):
        return Article.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.title = validated_data.get('title', instance.title)
        instance.content = validated_data.get('content', instance.content)
        instance.save()
        return instance

3.2 视图(Views) #

DRF提供多种视图类型:

text
视图类型层次结构
├── APIView          # 基础视图
├── GenericAPIView   # 通用视图基类
│   ├── ListAPIView
│   ├── CreateAPIView
│   ├── RetrieveAPIView
│   ├── UpdateAPIView
│   └── DestroyAPIView
└── ViewSet          # 视图集
    ├── ModelViewSet
    ├── ReadOnlyModelViewSet
    └── GenericViewSet

3.3 路由器(Router) #

路由器自动将ViewSet映射到URL:

python
from rest_framework.routers import DefaultRouter
from .views import ArticleViewSet

router = DefaultRouter()
router.register(r'articles', ArticleViewSet)

urlpatterns = router.urls

3.4 请求与响应 #

DRF扩展了Django的请求和响应对象:

python
from rest_framework.response import Response
from rest_framework.views import APIView

class ArticleListView(APIView):
    def get(self, request):
        articles = Article.objects.all()
        serializer = ArticleSerializer(articles, many=True)
        return Response(serializer.data)

四、应用场景 #

4.1 移动应用后端 #

DRF非常适合作为移动应用的后端API:

text
移动端应用
    │
    ▼
┌─────────────────┐
│   DRF API服务   │
├─────────────────┤
│ - 用户认证      │
│ - 数据接口      │
│ - 推送服务      │
│ - 文件上传      │
└─────────────────┘
    │
    ▼
┌─────────────────┐
│   数据库存储    │
└─────────────────┘

4.2 前后端分离项目 #

现代Web开发的主流架构:

text
┌─────────────────┐     ┌─────────────────┐
│   前端应用      │────▶│   DRF API服务   │
│ (Vue/React)     │◀────│                 │
└─────────────────┘     └─────────────────┘

4.3 微服务架构 #

作为微服务中的API服务:

python
# 用户服务
class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

# 订单服务
class OrderViewSet(viewsets.ModelViewSet):
    queryset = Order.objects.all()
    serializer_class = OrderSerializer

4.4 第三方API服务 #

构建对外开放的API平台:

python
from rest_framework.decorators import api_view, throttle_classes
from rest_framework.throttling import UserRateThrottle

class OncePerDayUserThrottle(UserRateThrottle):
    rate = '100/day'

@api_view(['GET'])
@throttle_classes([OncePerDayUserThrottle])
def api_data(request):
    return Response({'data': '...'})

五、DRF生态系统 #

5.1 核心组件 #

组件 功能
Serializers 数据序列化与反序列化
Views 处理HTTP请求
Routers URL路由映射
Authentication 用户认证
Permissions 权限控制
Pagination 分页处理
Filtering 数据过滤
Throttling 请求限流

5.2 常用扩展包 #

扩展包 功能
djangorestframework-simplejwt JWT认证
drf-spectacular OpenAPI文档
django-filter 高级过滤
drf-nested-routers 嵌套路由
drf-yasg Swagger文档

六、版本演进 #

版本 发布年份 重要特性
DRF 3.0 2015 重构序列化器
DRF 3.5 2016 改进的OpenAPI支持
DRF 3.10 2019 OpenAPI 3.0支持
DRF 3.12 2020 Django 3.0支持
DRF 3.14 2022 Django 4.0支持
DRF 3.15 2024 Python 3.12支持

七、学习路线 #

text
基础阶段
├── DRF安装与配置
├── 序列化器基础
├── 视图基础
└── URL路由

进阶阶段
├── 模型序列化器
├── 通用视图
├── 认证与权限
└── 分页与过滤

高级阶段
├── 视图集与路由器
├── 自定义序列化
├── 性能优化
└── API文档

八、前置知识 #

学习DRF前,建议掌握以下基础知识:

  • Python基础:变量、函数、类、装饰器
  • Django基础:模型、视图、URL、模板
  • HTTP协议:请求方法、状态码、请求头
  • REST概念:RESTful API设计原则
  • JSON格式:数据交换格式

九、开发环境 #

推荐的开发环境配置:

工具 推荐选项
Python版本 3.8+
Django版本 4.2 LTS
DRF版本 3.15+
代码编辑器 VS Code、PyCharm
API测试工具 Postman、curl、httpie
版本控制 Git

十、总结 #

Django REST Framework是一个优秀的API框架:

  • 开发效率高:快速构建RESTful API
  • 功能完善:认证、权限、分页开箱即用
  • 文档友好:内置API浏览界面
  • 社区活跃:丰富的第三方扩展

选择DRF的理由:

  • 已有Django项目需要添加API
  • 需要快速构建RESTful服务
  • 需要完善的认证和权限系统
  • 追求开发效率和代码质量

准备好开始学习DRF了吗?让我们进入下一章,学习如何安装和配置DRF环境!

最后更新:2026-03-28