对于restframework的详细阐述

一、简介

restframework是一个基于django的web框架,提供了一套强大的API接口开发工具,方便开发者快速构建RESTful风格的接口。restframework支持多种数据格式,如json,xml,yaml等,同时还提供了基于类视图、认证和授权、分页、过滤等常用功能的实现方案。

二、restframework-bulk批量更新

restframework-bulk是restframework的一个扩展插件,可以方便地实现批量更新或批量删除资源。使用restframework-bulk插件需要先将其安装到项目中。

    pip install djangorestframework-bulk

使用restframework-bulk的主要步骤:

1. 在serializer中,定义update()和delete()方法,实现对于多个对象的更新和删除操作

    from rest_framework import serializers
    from myapp.models import MyModel

    class MySerializer(serializers.ModelSerializer):
        class Meta:
            model = MyModel
            fields = '__all__'

        def update(self, queryset, all_validated_data):
            # 更新逻辑
            pass

        def delete(self, queryset):
            # 删除逻辑
            pass

2. 在view中使用BulkModelViewSet类来替代ModelViewSet类,并指定所用的serializer

    from rest_framework_bulk import BulkModelViewSet
    from myapp.models import MyModel
    from myapp.serializers import MySerializer

    class MyViewSet(BulkModelViewSet):
        queryset = MyModel.objects.all()
        serializer_class = MySerializer

这样就可以实现对于多个资源的批量更新或删除操作了。

三、安装restframework

安装restframework需要注意版本的兼容问题。一般来说,我们可以根据当前所使用的django版本来选择restframework对应的版本。

    pip install djangorestframework==3.12.4

安装完成后,需要在settings.py中添加相应的配置项

    INSTALLED_APPS = [
        ...,
        'rest_framework',
    ]

    REST_FRAMEWORK = {
        'DEFAULT_RENDERER_CLASSES': [
            'rest_framework.renderers.JSONRenderer',
            'rest_framework.renderers.XMLRenderer',
            'rest_framework.renderers.YAMLRenderer',
        ],
        'DEFAULT_AUTHENTICATION_CLASSES': [
            'rest_framework.authentication.BasicAuthentication',
            'rest_framework.authentication.SessionAuthentication',
        ],
        'DEFAULT_PERMISSION_CLASSES': [
            'rest_framework.permissions.IsAuthenticated',
        ],
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
        'PAGE_SIZE': 100,
    }

其中,DEFAULT_RENDERER_CLASSES定义了restframework支持的渲染器类型,DEFAULT_AUTHENTICATION_CLASSES定义了restframework支持的认证类型,DEFAULT_PERMISSION_CLASSES定义了restframework支持的授权类型,DEFAULT_PAGINATION_CLASS定义了restframework对于结果集的分页策略。

四、视图类

restframework提供了多种视图类,并支持建立自定义视图来满足不同的需求。常见的视图类有:

  • APIView:基于函数的视图,支持常规的CRUD操作
  • GenericAPIView:基于类的视图,支持常规的CRUD操作,提供了更便捷的方式来操作序列化数据
  • ModelViewSet:基于类的视图,支持常规的CRUD操作,封装了序列化器、查询集、渲染器、认证、授权等常用功能
  • ViewSetMixin:提供了一套完整的增删查改功能,可以用于快速创建自定义视图

下面是使用APIView创建视图的示例:

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from myapp.models import MyModel
    from myapp.serializers import MySerializer

    class MyList(APIView):
        def get(self, request, format=None):
            items = MyModel.objects.all()
            serializer = MySerializer(items, many=True)
            return Response(serializer.data)

        def post(self, request, format=None):
            serializer = MySerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

以上代码定义了一个基于函数的视图类,包含了常规的GET和POST请求处理函数。其中,GET请求返回全部的资源列表,POST请求用于创建新的资源。在函数中,需要使用serializer进行对于请求数据的验证、反序列化和序列化操作。如果验证通过则调用save()方法将数据保存到数据库中。

五、认证和授权

restframework支持多种认证和授权机制,包括:

  • 基于Token的认证: 使用API Token的方式进行认证,支持频繁的无状态访问
  • 基于Session的认证:使用类似web应用的会话来进行认证,支持复杂的有状态访问,但需要在服务端维护状态信息
  • OAuth1/2的认证:一种更为安全的认证方式,需要经过用户授权

在认证和授权过程中,需要在settings.py中配置相关的选项:

    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': [
            'rest_framework.authentication.TokenAuthentication',
        ],
        'DEFAULT_PERMISSION_CLASSES': [
            'rest_framework.permissions.IsAuthenticated',
        ],
        ...
    }

在view中可以使用装饰器来指定认证和授权的方式:

    from rest_framework.decorators import authentication_classes, permission_classes
    from rest_framework.authentication import BasicAuthentication
    from rest_framework.permissions import IsAuthenticated

    @authentication_classes([BasicAuthentication])
    @permission_classes([IsAuthenticated])
    class MyView(APIView):
        ...

以上代码指定了基于HTTP BasicAuthentication的认证方式,以及IsAuthenticated的授权方式。

六、过滤和分页

restframework提供了丰富的过滤和分页方案来满足不同的需求,包括:

  • 基于Query Params的过滤:支持对于GET请求中的Query Params进行过滤查询,如字段、日期、范围等
  • 基于ORM的过滤:支持使用django ORM进行高级的查询操作
  • 基于ModelViewSet的分页:使用ModelViewSet来支持常规的分页策略,如LimitOffsetPagination、PageNumberPagination、CursorPagination等

在使用过滤和分页功能之前,需要在settings.py中进行相关配置:

    REST_FRAMEWORK = {
        'DEFAULT_FILTER_BACKENDS': [
            'django_filters.rest_framework.DjangoFilterBackend',
            'rest_framework.filters.OrderingFilter',
        ],
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
        'PAGE_SIZE': 100,
        ...
    }

以上代码中定义了使用DjangoFilterBackend和OrderingFilter来支持基于Query Params的过滤和排序操作,使用LimitOffsetPagination来支持常规的分页操作。

在View中可以直接使用以上的过滤和分页方式:

    from rest_framework.filters import SearchFilter, OrderingFilter

    class MyViewSet(viewsets.ModelViewSet):
        queryset = MyModel.objects.all()
        serializer_class = MySerializer
        filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
        filterset_fields = ('field1', 'field2')
        search_fields = ('field1', 'field2')
        ordering_fields = ('field1', 'field2')
        pagination_class = LimitOffsetPagination

以上代码中定义了访问MyModel的ViewSet类,并指定了所用的serializer和queryset。filter_backends属性定义了要使用的过滤器类型,filterset_fields、search_fields和ordering_fields分别定义了要过滤、搜索和排序的字段,pagination_class指定了使用的分页策略。

七、序列化和反序列化

序列化和反序列化是restframework的核心功能之一。在定义资源模型时需要指定资源的属性和类型,同时还需要定义相应的序列化和反序列化器。

序列化器将一个模型对象转化为Python原生类型,以便于传输,而反序列化器则将Python原生类型转化为模型对象,以便于存储到数据库中。序列化和反序列化过程中都需要进行请求数据的验证和校验。

以下是对于序列化和反序列化器的定义:

    from rest_framework import serializers
    from myapp.models import MyModel

    class MySerializer(serializers.ModelSerializer):
        class Meta:
            model = MyModel
            fields = '__all__'

以上代码定义了一个简单的序列化器,使用fields属性将全部模型字段进行序列化。如果需要对于序列化进行更为细致的控制,可以使用SerializerMethodField或覆写to_representation/to_internal_value方法。

在视图中,需要使用serializer对请求数据进行验证和反序列化:

    from rest_framework.response import Response
    from rest_framework import status
    from myapp.serializers import MySerializer

    class MyView(APIView):
        def post(self, request):
            serializer = MySerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response({'success': True})
            else:
                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

以上代码定义了一个视图类,并使用MySerializer对请求数据进行验证和反序列化。如果验证通过,修改save()方法可以将数据保存到数据库中。

八、结语

restframework提供了强大的API接口开发工具集,上述的内容仅仅是引入了restframework的一部分基础功能。在开发实践中,还需要结合具体的业务需求,进行更为细致的配置和开发。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/244756.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 13:04
下一篇 2024-12-12 13:04

相关推荐

  • index.html怎么打开 – 详细解析

    一、index.html怎么打开看 1、如果你已经拥有了index.html文件,那么你可以直接使用任何一个现代浏览器打开index.html文件,比如Google Chrome、…

    编程 2025-04-25
  • Resetful API的详细阐述

    一、Resetful API简介 Resetful(REpresentational State Transfer)是一种基于HTTP协议的Web API设计风格,它是一种轻量级的…

    编程 2025-04-25
  • 关键路径的详细阐述

    关键路径是项目管理中非常重要的一个概念,它通常指的是项目中最长的一条路径,它决定了整个项目的完成时间。在这篇文章中,我们将从多个方面对关键路径做详细的阐述。 一、概念 关键路径是指…

    编程 2025-04-25
  • neo4j菜鸟教程详细阐述

    一、neo4j介绍 neo4j是一种图形数据库,以实现高效的图操作为设计目标。neo4j使用图形模型来存储数据,数据的表述方式类似于实际世界中的网络。neo4j具有高效的读和写操作…

    编程 2025-04-25
  • AXI DMA的详细阐述

    一、AXI DMA概述 AXI DMA是指Advanced eXtensible Interface Direct Memory Access,是Xilinx公司提供的基于AMBA…

    编程 2025-04-25
  • c++ explicit的详细阐述

    一、explicit的作用 在C++中,explicit关键字可以在构造函数声明前加上,防止编译器进行自动类型转换,强制要求调用者必须强制类型转换才能调用该函数,避免了将一个参数类…

    编程 2025-04-25
  • HTMLButton属性及其详细阐述

    一、button属性介绍 button属性是HTML5新增的属性,表示指定文本框拥有可供点击的按钮。该属性包括以下几个取值: 按钮文本 提交 重置 其中,type属性表示按钮类型,…

    编程 2025-04-25
  • crontab测试的详细阐述

    一、crontab的概念 1、crontab是什么:crontab是linux操作系统中实现定时任务的程序,它能够定时执行与系统预设时间相符的指定任务。 2、crontab的使用场…

    编程 2025-04-25
  • Vim使用教程详细指南

    一、Vim使用教程 Vim是一个高度可定制的文本编辑器,可以在Linux,Mac和Windows等不同的平台上运行。它具有快速移动,复制,粘贴,查找和替换等强大功能,尤其在面对大型…

    编程 2025-04-25
  • forof遍历对象的详细阐述

    forof是一种ES6的语法糖,用于遍历可迭代对象。相较于传统的for循环和forEach方法,forof更加简洁、易读,并且可以遍历各种类型的数据。 一、基本语法 forof的基…

    编程 2025-04-25

发表回复

登录后才能评论