Django Rest Framework (DRF)
介绍
Django REST framework (DRF) 是一个功能强大且灵活的工具包,用于在 Django 中构建 Web API。
你可以把它理解为 Django 的一个“超级英雄”扩展。Django 本身最擅长的是构建具有前端模板的“全栈”网站(即后端+前端页面)。而 DRF 的职责是专门让 Django 专注于扮演强大、安全的“后端 API 服务器”角色,为各种客户端(如 Web 前端、移动App、其他服务等)提供数据接口。
它的核心作用是:将你的 Django 数据模型(Models)快速、轻松、标准化地转换为 RESTful 风格的 API 接口。
主要特点和核心功能
DRF 之所以如此流行,是因为它封装了构建 API 的许多通用、繁琐且容易出错的部分,提供了“开箱即用”的解决方案:
序列化
- 提供了强大的
Serializer
和ModelSerializer
类,极大简化了序列化器的编写
- 提供了强大的
视图
APIView
: 基于类的视图,提供了比 Django 原生 View 更适用于 API 的请求/响应循环。GenericAPIView
和Mixin
类:提供了与常见操作(如列表、创建、检索、更新、删除)绑定的通用行为,让你写极少的代码就能完成 CRUD 接口。ViewSet
和ModelViewSet
:最高级别的封装,一个ModelViewSet
类可以自动为你提供一个模型的所有 CRUD 端点(List, Create, Retrieve, Update, Delete, Partial Update)。
路由
- 配合
ViewSet
使用,可以自动生成URL
配置,你不再需要手动为每个视图编写URL
模式,大大减少了重复代码。
- 配合
认证 (Authentication) 与权限 (Permissions)
- 开箱即用的认证方案:支持 Session、Token、JWT (通过第三方包) 等多种认证方式。
- 强大的权限控制:可以轻松配置全局或视图级别的权限,如
IsAuthenticated
(是否登录)、IsAdminUser
(是否是管理员)、DjangoModelPermissions
(基于 Django 的模型权限)等,也可以轻松自定义权限类。
Browsable API
这是 DRF 的一个“杀手级”功能。它为你的 API 自动生成一个美观、人性化的 Web 界面。开发者可以直接在浏览器中查看 API 文档、测试 API 接口、提交数据,极大地提高了后端开发者和前端开发者的联调效率。
其他:还包括 throttling(限流)、filtering(过滤)、pagination(分页)等常用功能。
DRF序列化器
Django 原生序列化方式是在 models
中通过重写__str__()
来实现:
# models.py
class MainMenu(models.Model):
main_menu_id = models.IntegerField()
main_menu_name = models.CharField(max_length=255)
main_menu_url = models.CharField(max_length=255, blank=True, null=True)
# 重写__str__方法, 新建一个字典,将所有字段都放在字典中,将字典传出
def __str__(self):
result = {
"main_menu_id": self.main_menu_id,
"main_menu_name": self.main_menu_name,
"main_menu_url": self.main_menu_url,
}
return json.dumps(result, ensure_ascii=False)
class Meta:
managed = False
db_table = 'main_menu'
# views.py
class GoodsMainMenu(View):
def get(self, request):
# 获取MainMenu表中的所有行
main_menu = MainMenu.objects.all()
result_list = []
# 对每一行数据调用序列化方法, 转换成json格式
for m in main_menu:
result_list.append(m.__str__())
return HttpResponse(result_list)
DRF序列化器提供了一种可以在视图中直接进行序列化的方式:
# serializers.py
class GoodsSerializer(serializers.ModelSerializer):
# 这里写的字段是想要进行自定义处理的字段
p_price = serializers.SerializerMethodField()
# 自定义序列化方法时,方法名必须是 get_<字段名>
def get_p_price(self, obj):
return float(obj.p_price)
# create update方法会在serializer.save()时自动调用
def create(self, validated_data):
"""
Create a new "article" instance
"""
def update(self, validated_data):
"""
Create a new "article" instance
"""
return Goods.objects.create(**validated_data)
class Meta:
model = Goods
fields = '__all__'
# views.py
class GoodsMainMenu(View):
def get(self, request):
# 获取MainMenu表中的所有行
main_menu = MainMenu.objects.all()
# 反序列化: data
serializer = GoodsSerializer(data=main_menu, many=True)
# 序列化: instance
result = GoodsSerializer(instance=main_menu, many=True)
return HttpResponse(result)
DRF视图API
APIView
APIView 继承自 Django 的 View 类。但是 APIView 做了以下增强:
- 请求对象: 将Django的 HttpRequest 对象封装为DRF的 Request 对象, 提供更强大的请求解析(如 解析JSON、表单等)
- 响应对象: 使用DRF的Response对象,可以将响应轻松渲染成JSON等类型。
- 异常处理: 提供了专门的异常处理,将Django和Python异常自动转换为合适的HTTP响应
- 认证与权限: 内置了认证、权限、限流等API相关功能的钩子
示例:
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
class MyAPIView(APIView):
def get(self, request):
# 直接使用 DRF 的 Response,它会自动处理内容协商
data = {'message': 'Hello, DRF World!'}
return Response(data)
GenericAPIView
GenericAPIView继承自APIView, 它在APIView基础上进一步抽象了通用模式。它通常不直接使用, 而是作为各种通用视图类(如 ListAPIView, CreateAPIView)的基类。相较于APIView它的增强如下:
- 获取数据集: 提供了
queryset
、get_queryset()
、get_object()
来分别定义查询集、获取模型实例集合、获取单个模型实例。 - 获取序列化器: 提供了
serializer_class
、get_serializer()
来管理序列化器。
示例:
# views.py
from rest_framework.generics import GenericAPIView
class BookListGenericView(GenericAPIView):
queryset = Book.objects.all() # 定义基础查询集
serializer_class = BookSerializer # 定义使用的序列化器
# 处理 GET 请求(获取列表)
def get(self, request, *args, **kwargs):
# 使用父类提供的 .get_queryset() 方法获取查询集
books = self.get_queryset()
# 使用父类提供的 .get_serializer() 方法获取序列化器实例
# 将查询集传入,`many=True` 表示序列化多个对象
serializer = self.get_serializer(books, many=True)
# 返回序列化后的数据
return Response(serializer.data)
视图集 ViewSetMixin
视图集是一种将多个相关视图的逻辑组合到一个类中的高级抽象。它允许开发者用更少的代码实现完整的 CRUD(Create, Retrieve, Update, Delete)操作。
特点
减少重复代码:将 list、create、retrieve、update、delete 等操作整合到一个类中
自动化路由:配合路由器(Router)自动生成 URL 配置
保持一致性:确保同一资源的不同操作使用相同的查询集和序列化器配置
提高开发效率:用极少的代码快速构建完整的 RESTful API
核心视图集类
ViewSet
:基础视图集类GenericViewSet
:最常用的基类,提供模型操作工具ModelViewSet
:提供完整 CRUD 操作的"全能"视图集ReadOnlyModelViewSet
:提供只读操作的视图集