• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Django之DRF框架學習(Django REST framework)——其他功能(認證、權限、限流、過濾、排序、分頁、異常處理、生成接口文檔)

    標簽: 后端  Python  api  django

    DRF之認證、權限、限流、過濾、排序、分頁、異常處理、生成接口文檔

    認證

    1. 全局認證
      在配置文件中配置全局默認的認證方案
    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES':(
            'rest_framework.authentication.BasicAuthentication',   # 基本認證
            'rest_framework.authentication.SessionAuthentication', # session認證
        )
    }
    
    1. 局部認證
      在每個視圖中通過設置authentication_classess屬性來設置
    from rest_framework.authentication import SessionAuthentication, BasicAuthentication
    
    class BookInfo(APIView):
    	authentication_classess = (SessionAuthentication, BasicAuthentication)
    
    1. 認證失敗的返回值
    • 401 Unauthorized 未認證
    • 403 Permission Denied 權限被禁止

    權限

    • 提供的權限
      1.AllowAny 允許所有用戶
      2.IsAuthenticated 僅通過認證的用戶
      3.IsAdminUser 僅管理員用戶
      4.IsAuthenticatedOrReadOnly 認證的用戶可以完全操作,否則只能get讀取

      例子:

    配置文件為上面全局認證的配置信息

    具體的視圖如下:

    from rest_framework.response import Response
    
    from booktest.models import BookInfo,HeroInfo
    from .serializers import BookInfoModelSerializer
    from rest_framework.viewsets import ViewSet,GenericViewSet,ReadOnlyModelViewSet,ModelViewSet
    
    from rest_framework.decorators import action  # 自定義視圖的路由
    from rest_framework.permissions import IsAdminUser,AllowAny,IsAuthenticated,IsAuthenticatedOrReadOnly
    
    class BookViewSet( ModelViewSet):
        queryset = BookInfo.objects.all()
        serializer_class =  BookInfoModelSerializer
        permission_classes = [IsAuthenticated]  # 只有通過認證的用戶
    

    假如沒通過認證的用戶訪問api時,出現如下:
    在這里插入圖片描述
    這里選擇的認證條件為:

    permission_classes = [IsAuthenticated] # 只有通過認證的用戶

    • 自定義權限
      如果需要自定義權限,需要繼承rest_framework.permissions.BasePermission父類,并實現以下兩個任何一個方法或全部
    1. .has_permission(self, request, view)
      是否可以訪問視圖,view表示當前視圖對象
    2. .has_object_permission(self, request, view, obj)
      是否可以訪問數據對象, view表示當前視圖,obj為數據對象例如:
      class MyPermission(BasePermission):
      	def has_object_permission(self, request, view, obj):
      		'''控制obj對象的訪問權限,此案例拒絕所有對對象的訪問'''
      		return False
      class BookInfoViewSet(ModelViewSet):
      	queryset = BookInfo.objects.all()
      	serializer_class = BookInfoSerializer
      	permission_classes = [IsAuthenticated, MyPermission]
      

    限流Throttling

    可以對接口訪問的頻次進行限制,以減輕服務器壓力。

    • 全局的配置
    REST_FRAMEWORK = {
       ...
        'DEFAULT_THROTTLE_CLASSES':( # 限流配置
            'rest_framework.throttling.AnonRateThrottle',   # 匿名用戶
            'rest_framework.throttling.UserRateThrottle',   # 登錄用戶
        ),
        'DEFAULT_THROTTLE_RATES':{ # 限流頻次
            'anon':'10/day',  # 匿名頻次
            'user':'15/day'  # 登錄用戶頻次
        }
    }
    

    可以在配置文件中,使用DEFAULT_THROTTLE_CLASSES 和 DEFAULT_THROTTLE_RATES 進行全局配置
    DEFAULT_THROTTLE_RATES 可以使用 second,minute,hour,day等來指定周期
    也可以在具體視圖中通過throttle_classess屬性來配置

    from rest_framework.throttling import UserRateThrottle
    from rest_framework.views import APIView
    
    class BookInfoView(APIView):
    	throttle_classes = (UserRateThrottle,)
    	...
    
    • 可選限流類
      1)AnonRateThrottle
      限制所有匿名未認證用戶,使用IP區分用戶
      使用 DEFAULT_THROTTLE_RATES[‘anon’] 來設置頻次
      2)UserRateThrottle
      限制認證用戶, 使用 User id 來區分
      使用 DEFAULT_THROTTLE_RATES[‘user’] 來設置頻次
      3)ScopedRateTHrottle
      限制用戶對于每個視圖的訪問頻次,使用id或者user id.
      例如
    REST_FRAMEWORK = {
        'DEFAULT_THROTTLE_CLASSES':( # 限流配置
            'rest_framework.throttling.ScopedRateThrottle',  #自定義限制
        ),
        'DEFAULT_THROTTLE_RATES':{ # 限流頻次
            'seven': '7/day'  #指定的視圖訪問次數限流
        }
    }
    

    在視圖中指定自定的限流

    class HeroViewSet( ModelViewSet):
        queryset = HeroInfo.objects.all()
        serializer_class =  HeroInfoModelSerializer
        throttle_scope = 'seven'  # 指定此視圖限流次數
    

    過濾Filtering

    對于列表數據可能需要根據字段進行過濾,我們可以通過添加django-filter擴展來增強支持

    pip install django-filter

    在配置文件中增加過濾設置

    INSTALLED_APPS = [
    	...
        #過濾設置
        'django_filters',
    ]
    REST_FRAMEWORK = {
        'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
    }
    
    

    在視圖中添加filter_fields屬性,指定可以過濾的字段

    class HeroViewSet( ModelViewSet):
        queryset = HeroInfo.objects.all()
        serializer_class =  HeroInfoModelSerializer
        throttle_scope = 'seven'  # 指定此視圖限流次數
        filter_fields = ['hname', 'hcomment']   # 指定可以過濾的字段
    
    

    排序

    對于列表數據,REST framework提供了OrderingFilter過濾器來幫助我們快速指明數據按照指定字段進行排序

    • 使用方法
      在類視圖中設置子filter_backends, 使用 rest_framework.filters.OrderingFilter過濾器,REST framework會在請求的查詢字符串中檢查是否包含ordering參數,如果包含了ordering參數,則按照ordering參數指明的排序字段對數據集進行排序。
      前端 可以 傳遞的ordering參數的可選字段值需要在 ordering_fields中指明
      例如:
    from rest_framework.filters import OrderingFilter  # 排序過濾
    
    class HeroViewSet(ModelViewSet):
        queryset = HeroInfo.objects.all()
        serializer_class =  HeroInfoModelSerializer
        throttle_scope = 'seven'  # 指定此視圖限流次數
        # filter_fields = ['hname', 'hcomment']   # 指定可以過濾的字段
        filter_backends = [OrderingFilter]  # 排序過濾
        ordering_fields = ['id', 'hname']  # 可排序查詢的字段
    

    查詢語法:

    http://127.0.0.1:8000/book/heros/?ordering=-id

    版權聲明:本文為Seven597原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/Seven597/article/details/110732723

    智能推薦

    七、Django rest framework 過濾排序分頁

    一、過濾Filtering 對于列表數據可能需要根據字段進行過濾,我們可以通過添加django-fitlter擴展來增強支持。 pip install django-filter 在配置文件中增加過濾后端的設置: 在視圖中添加filter_fields屬性,指定可以過濾的字段 然后訪問127.0.0.1:8000/books/?btitle=西游記 二、排序 對于列表數據,REST framewo...

    django: django rest framework 分頁

    django rest framework pagination 在drf中對于數據的返回支持多種分頁技巧,在官網中主要向我們介紹了PageNumberPagination、LimitOffsetPagination、CursorPagination。 本課程的講解使用示例項目,該項目的目錄結構如下所示: 目錄結構 該目錄結構與django原生的目錄結構差異較大,其中所有的django應用都在ap...

    Django Rest Framework之視圖

    Django Rest Framework之視圖 一:編寫視圖的三種方式 二:mixin類編寫視圖 三:基于類的視圖 四:ModelViewSet的視圖 一:編寫視圖的三種方式 mixin類編寫視圖 基于類的視圖 ModelViewSet的視圖 二:mixin類編寫視圖 路由設計: 視圖類: 三:基于類的視圖 路由設計: 視圖類: 四:ModelViewSet的視圖 路由設計: 五種訪問方式放在同...

    Django REST Framework學習筆記

    Django REST Framework學習筆記,這里不會對Django做介紹,只是自己對Django REST Framework學習的記錄。 環境說明: Python3.7 Django2.2 DRF是什么?為何要使用DRF? WHAT:Django REST framework是一套基于Django框架編寫RESTful風格API的組件(功能強大且靈活的工具包),用于構建Web API。 ...

    Django REST framework【學習內容】

    快速入門 我們將創建一個簡單的允許管理員用戶查看和編輯系統中的用戶和組的API。 項目設置 創建一個名為 tutorial 的新django項目,然后啟動一個名為 quickstart 的新app。 現在第一次同步你的數據庫: 我們還要創建一個名為 admin 的初始用戶,密碼為 password123。我們稍后將在該示例中驗證...

    猜你喜歡

    Django REST Framework入門學習

    Django REST Framework 導學 學習目標:使用DRF開發RESTful API接口 學習內容:序列化(serializers)、視圖集(viewsets)、路由(routers)、認證(authentication)、認證(permission) 學習效果:DRF的多種視圖實現課程信息的增刪改查 一、創建項目 1.1 創建Django項目 1.2 修改 settings.py配置...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡