DRF:Django REST Framework框架介绍
“在前后端彻底分离的时代,不掌握DRF,就等于错过了Django的下半场。”
——这句话,适合贴在每个Python开发者的显示器边框。
一、为什么要学DRF?——API经济的入场券
维度 | 传统Django | DRF |
---|---|---|
协议 | HTML | JSON/XML/YAML |
客户端 | 浏览器 | 任意(Web、iOS、Android、IoT) |
并发模型 | 同步渲染 | 异步解耦 |
团队协同 | 前后端串行 | 并行开发,效率×3 |
一句话总结:
DRF把“Django”变成了“Django as a Service”。
二、5张图,吃透DRF核心组件
1. 一张“地铁图”看透请求生命周期
站点 | 对应DRF组件 | 开发提示 |
---|---|---|
入口安检 | APIView /@api_view | 权限、限流、版本号统一入口 |
序列化闸机 | Serializer /ModelSerializer | 数据清洗、字段校验、反序列化一键完成 |
数据库月台 | GenericViewSet + queryset | 一行代码搞定CRUD |
出站检票 | Response + Renderer | JSON、CSV、YAML可插拔切换 |
2. 序列化:比ORM更强大的“翻译官”
# models.py
class Employee(models.Model):name = models.CharField(max_length=50)join_date = models.DateField()salary = models.DecimalField(max_digits=12, decimal_places=2)# serializers.py
class EmployeeSerializer(serializers.ModelSerializer):# 只读字段:工龄years_of_service = serializers.SerializerMethodField()# 写字段:一次性调薪百分比raise_percent = serializers.FloatField(write_only=True, default=0)class Meta:model = Employeefields = ["id", "name", "join_date", "salary", "years_of_service", "raise_percent"]def get_years_of_service(self, obj):return (date.today() - obj.join_date).days // 365def update(self, instance, validated_data):percent = validated_data.pop("raise_percent", 0)instance.salary *= (1 + percent / 100)return super().update(instance, validated_data)
把“数据库行”翻译成“前端JSON”,还能顺手做业务计算,这就是序列化的威力。
3. 视图“三阶进化”:从10行到1行代码
阶段 | 写法 | 代码量 | 适用场景 |
---|---|---|---|
① 原生APIView | 手写get/post/delete | 30+ | 高度定制逻辑 |
② GenericAPIView+mixins | ListModelMixin, CreateModelMixin… | 10 | 标准CRUD |
③ ViewSet + Router | 自动生成路由 | 1 | 80%业务场景 |
# urls.py
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r"employees", EmployeeViewSet)urlpatterns = [path("api/", include(router.urls)), # 一次性注册CRUD+分页+过滤
]
用ViewSet= 让代码瘦成一道闪电⚡️
4. 权限与限流:给企业API上“双重锁”
# permissions.py
class IsOwnerOrReadOnly(permissions.BasePermission):def has_object_permission(self, request, view, obj):if request.method in permissions.SAFE_METHODS:return Truereturn obj.owner == request.user# settings.py
REST_FRAMEWORK = {"DEFAULT_THROTTLE_CLASSES": ["rest_framework.throttling.AnonRateThrottle","rest_framework.throttling.UserRateThrottle",],"DEFAULT_THROTTLE_RATES": {"anon": "100/day","user": "1000/day",},
}
权限颗粒度到“数据行”,限流动态可配,DRF让ToB交付更安心。
5. 文档即代码:Swagger-UI零成本生成
安装:
pip install drf-spectacular
一行配置:
REST_FRAMEWORK = {"DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema",
}
访问 http://localhost:8000/api/schema/swagger/
从此写代码=写文档,产品经理再也不会说“接口文档又双叒叕滞后了”。
三、实战:用DRF 15分钟上线一个“可搜索+分页+权限”的员工API
步骤 | 命令/代码 | 耗时 |
---|---|---|
1. 创建项目 & 安装依赖 | django-admin startproject hr_system && pip install djangorestframework django-filter | 2’ |
2. 建模 & 初始化数据 | python manage.py loaddata mock_emps.json | 3’ |
3. 序列化 & 视图 & 路由 | 见上文代码块 | 5’ |
4. 配置过滤&搜索&分页 | 见下方代码 | 3’ |
5. 运行 & Swagger验证 | python manage.py runserver | 2’ |
# views.py
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filtersclass EmployeeViewSet(viewsets.ModelViewSet):queryset = Employee.objects.all()serializer_class = EmployeeSerializerpermission_classes = [IsAuthenticated, IsOwnerOrReadOnly]filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]filterset_fields = ["department", "level"]search_fields = ["name", "email"]ordering_fields = ["salary", "join_date"]pagination_class = PageNumberPagination # 默认20条/页
15分钟,你得到的是一个生产级、带文档、可搜索、可分页、带权限的REST API。
如果手写Flask或Spring,同等功能至少需要2小时起步。
四、避坑指南:DRF新手最常踩的5个坑
-
把序列化当ORM用
在Serializer.save()
里写复杂业务 → 应放到ModelViewSet.perform_create()
或service层。 -
滥用
APIView
能用ModelViewSet
就别手写get
/post
,否则一夜回到“自由泳”。 -
忽略
select_related
/prefetch_related
循环嵌套序列化外键,N+1查询直接拖垮数据库。 -
把权限写在每个视图
全局DEFAULT_PERMISSION_CLASSES
+局部覆盖,才是DRF推荐姿势。 -
部署不关Debug
生产环境忘记设置DEBUG=False
,Swagger泄露全部字段结构,安全漏洞原地爆炸。
五、写在最后
“框架每年一换,但对API设计思想的理解会让你在未来10年持续受益。”
掌握DRF,不只是多学了一个库,而是真正迈入前后端分离、微服务、API经济的大门。