Skip to content

Django Rest Framework (DRF)

介绍

Django REST framework (DRF) 是一个功能强大且灵活的工具包,用于在 Django 中构建 Web API。

你可以把它理解为 Django 的一个“超级英雄”扩展。Django 本身最擅长的是构建具有前端模板的“全栈”网站(即后端+前端页面)。而 DRF 的职责是专门让 Django 专注于扮演强大、安全的“后端 API 服务器”角色,为各种客户端(如 Web 前端、移动App、其他服务等)提供数据接口。

它的核心作用是:将你的 Django 数据模型(Models)快速、轻松、标准化地转换为 RESTful 风格的 API 接口。

主要特点和核心功能

DRF 之所以如此流行,是因为它封装了构建 API 的许多通用、繁琐且容易出错的部分,提供了“开箱即用”的解决方案:

  1. 序列化

    • 提供了强大的 SerializerModelSerializer 类,极大简化了序列化器的编写
  2. 视图

    • APIView: 基于类的视图,提供了比 Django 原生 View 更适用于 API 的请求/响应循环。
    • GenericAPIViewMixin 类:提供了与常见操作(如列表、创建、检索、更新、删除)绑定的通用行为,让你写极少的代码就能完成 CRUD 接口。
    • ViewSetModelViewSet:最高级别的封装,一个 ModelViewSet 类可以自动为你提供一个模型的所有 CRUD 端点(List, Create, Retrieve, Update, Delete, Partial Update)。
  3. 路由

    • 配合 ViewSet 使用,可以自动生成 URL 配置,你不再需要手动为每个视图编写 URL 模式,大大减少了重复代码。
  4. 认证 (Authentication) 与权限 (Permissions)

    • 开箱即用的认证方案:支持 Session、Token、JWT (通过第三方包) 等多种认证方式。
    • 强大的权限控制:可以轻松配置全局或视图级别的权限,如 IsAuthenticated(是否登录)、IsAdminUser(是否是管理员)、DjangoModelPermissions(基于 Django 的模型权限)等,也可以轻松自定义权限类。
  5. Browsable API

    这是 DRF 的一个“杀手级”功能。它为你的 API 自动生成一个美观、人性化的 Web 界面。开发者可以直接在浏览器中查看 API 文档、测试 API 接口、提交数据,极大地提高了后端开发者和前端开发者的联调效率。

  6. 其他:还包括 throttling(限流)、filtering(过滤)、pagination(分页)等常用功能。

DRF序列化器

Django 原生序列化方式是在 models 中通过重写__str__()来实现:

python
# 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'
python
# 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序列化器提供了一种可以在视图中直接进行序列化的方式:

python
# 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__'
python
# 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相关功能的钩子

示例:

python
# 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它的增强如下:

  • 获取数据集: 提供了 querysetget_queryset()get_object() 来分别定义查询集、获取模型实例集合、获取单个模型实例。
  • 获取序列化器: 提供了 serializer_classget_serializer() 来管理序列化器。

示例:

python
# 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:提供只读操作的视图集

认证与权限

Browsable API

Last Updated: