一、简介
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