對於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/zh-hant/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

發表回復

登錄後才能評論