一、簡介
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/zh-hk/n/244756.html