日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django REST Framework API Guide 07

發布時間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django REST Framework API Guide 07 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本節大綱

  1、Permissions

  2、Throttling

?

Permissions

權限是用來授權或者拒絕用戶訪問API的不同部分的不同的類的?;A的權限劃分

1、IsAuthenticated 允許任何通過認證的用戶訪問,拒絕任何沒有通過認證的用戶。2、IsAuthenticatedOrReadOnly 認證通過的用戶有所有訪問權限,反之只有只讀權限

權限的定義

rest框架內的權限總是被定義成一個權限類的列表。主視圖運行前檢查,失敗就引發exceptions.PermissionDenied或者exceptions.NotAuthenticated異常

權限檢查失敗會根據下面的情況返回'403 Forbidden'或'401 Unauthorized':

1、請求驗證成功,權限拒絕 # 返回HTTP 403 Forbidden響應 2、請求沒有驗證成功,最上面的驗證類沒有使用'WWW-Authenticate'# 返回'HTTP 403 Forbidden' 響應 3、請求沒有認證成功,最上面的認證類沒有使用'WWW-Authenticate'# 返回'HTTP 401 Unauthorized'響應,帶有一個合適的WWW-Authenticate

?

對象級別的權限

在rest框架內,存在于一般視圖的.get_object()方法里,如果不允許,引發exceptions.PermissionDenied異常。

如果您正在編寫自己的視圖,并且希望強制執行對象級別的權限,或者如果您在一般視圖上重寫.get_object()方法,那么您將需要在檢索對象時顯式地調用視圖上的.check_object_per.(request,obj)方法。失敗則引發PermissionDenied或者NotAuthenticated異常

def get_object(self):obj = get_object_or_404(self.get_queryset(), pk=self.kwargs["pk"])self.check_object_permissions(self.request, obj)return obj

對象級別權限的限制

事實上,因為效率原因通用視圖不會自動應用對象級別的權限到每一個實例里。通常,當使用對象級別權限時,還希望適當地過濾queryset,以確保用戶只對它們允許查看的實例具有可見性。

?

設置權限策略

默認可以全局設置,使用DEFAULT_PERMISSION_CLASSES

REST_FRAMEWORK = {'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated',) }

如果沒有指定,默認設定是允許不受限制的訪問

'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.AllowAny', )

在CBV的View或者ViewSet上

from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIViewclass ExampleView(APIView):permission_classes = (IsAuthenticated,)def get(self, request, format=None):content = {'status': 'request was permitted'}return Response(content)

在FBV上

from rest_framework.decorators import api_view, permission_classes from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response@api_view(['GET']) @permission_classes((IsAuthenticated, )) def example_view(request, format=None):content = {'status': 'request was permitted'}return Response(content)

?

API Reference

1、AllowAny

允許不受限制的訪問,無論請求有沒有被認證。

2、IsAuthenticated

拒絕沒有通過認證的用戶。適用于API只允許注冊用戶訪問

3、IsAdminUser

拒絕任何的用戶,除非user.is_staffTrue才能訪問

4、IsAuthenticatedOrReadOnly

允許通過認證的用戶執行任何請求,沒有通過認證的用戶是只讀權限,安全方法:GET,?HEAD?或者?OPTIONS.

?

DjangoModelPermissions

此權限綁定到Django標準的django.contrib.auth 模型權限。必須紙杯應用于有.queryset屬性的視圖。只有被認證并有相關模型權限的用戶才能被授權

POST # 對應model的add權限 PUT和PATCH # 對應model的change權限 delete # 對應model的delete權限

視圖不包含queryset屬性

如果view里面沒有queryset,而是重寫了get_queryset()方法,在這種案例里面,我們還建議用前哨查詢設置標記視圖,這樣類能決定需要的權限。

queryset = User.objects.none() # Required for DjangoModelPermissions

DjangoModelPermissionOrAnonReadOnly

跟DjangoModelOermissions很像,沒有認證的用戶只讀權限

DjangoObjectPermission

跟DjangoModelPermissions一樣

?

Custom Permission

實施客制化權限,重寫BasePermission,實行下面的方法中的一個或多個

.has_permission(self, request, view) .has_object_permission(self, request, view, obj)

這些方法在應該授權時返回True。你需要測試請求是讀操作或寫操作,應該檢查請求方法是否在'GET', 'OPTIONS'和'HEAD' 組成的SAFE_METHODS里面

if request.method in permissions.SAFE_METHODS:# Check permissions for read-only request else:# Check permissions for write request

has_object_permission方法只有在通過視圖級別的has_permission方法時才會被調用。另外為了讓實例級別的檢查運行,視圖代碼應該顯式的調用.check_object_permissions(request, obj). 如果你使用通用視圖,默認將自動處理。

檢查失敗會引發PermissionDenied異常。改變錯誤信息跟異常綁定,在你的客制化權限里面申明message。否則PermissionDenieddefault_detail屬性將被使用

from rest_framework import permissionsclass CustomerAccessPermission(permissions.BasePermission):message = 'Adding customers not allowed.'def has_permission(self, request, view):...

示例

from rest_framework import permissionsclass BlacklistPermission(permissions.BasePermission):"""Global permission check for blacklisted IPs."""def has_permission(self, request, view):ip_addr = request.META['REMOTE_ADDR']blacklisted = Blacklist.objects.filter(ip_addr=ip_addr).exists()return not blacklisted

跟全局設置很像,你可以創建一個對象級別的權限對所有到來的請求,只有通過的能操作一個特殊的對象實例。

class IsOwnerOrReadOnly(permissions.BasePermission):"""Object-level permission to only allow owners of an object to edit it.Assumes the model instance has an `owner` attribute."""def has_object_permission(self, request, view, obj):# Read permissions are allowed to any request,# so we'll always allow GET, HEAD or OPTIONS requests.if request.method in permissions.SAFE_METHODS:return True# Instance must have an attribute named `owner`.return obj.owner == request.user

Throttling

節流(throttling)在rest框架內總是被定義成一組類的列表。同樣在主題視圖之前執行檢查,失敗引發exceptions.Throttled異常

設置節流策略

全局設置使用DEFAULT_THROTTLE_CLASSESDEFAULT_THROTTLE_RATES參數。

REST_FRAMEWORK = {'DEFAULT_THROTTLE_CLASSES': ('rest_framework.throttling.AnonRateThrottle','rest_framework.throttling.UserRateThrottle'),'DEFAULT_THROTTLE_RATES': {'anon': '100/day','user': '1000/day'} }

DEFAULT_THROTTLE_RATES可以包含second, minute, hourday作為節流周期。

你也可以為每個視圖或者視圖集設置節流,CBV格式

from rest_framework.response import Response from rest_framework.throttling import UserRateThrottle from rest_framework.views import APIViewclass ExampleView(APIView):throttle_classes = (UserRateThrottle,)def get(self, request, format=None):content = {'status': 'request was permitted'}return Response(content)

在FBV里面

@api_view(['GET']) @throttle_classes([UserRateThrottle]) def example_view(request, format=None):content = {'status': 'request was permitted'}return Response(content)

?

設置緩存

節流類是REST框架提供的,使用了Django的緩存后端。你應該確保已經設置了合適的緩存設定。

如果你想使用一個緩存而不是默認的'default',你可以創建客制化的節流類并設置緩存cache屬性

class CustomAnonRateThrottle(AnonRateThrottle):cache = get_cache('alternate')

別忘了設置DEFAULT_THROTTLE_CLASSES或者使用throttle_classes視圖屬性

API Reference

AnonRateThrottle

AnonRateThrottle只限制沒有認證的用戶。訪問請求的IP地址被用來生成唯一的鍵用來做限制。從下面幾個方面來做請求率限制

1、類上的rate屬性重寫AnonRateThrottle并設置此屬性 2、DEFAULT_THROTTLE_RATES['anon']設置

AnonRateThrottle很適合做對于未知資源請求的限制

?

UserRateThrottle

UserRateThrottle將通過一個給定的API速率來限制用戶在API上的請求。用戶的ID被用來生成唯一的節流鍵。未認證的請求將使用IP地址來生成唯一節流鍵。

請求的限定方面

1rate屬性,重寫的UserRateThrottle,設置此屬性 2、DEFAULT_THROTTLE_RATES['user']設置

一個API可能同時有多個UserRateThrottle在同一個地方。所以你需要重寫UserRateThrottle并設置唯一'scope'為每一個類

class BurstRateThrottle(UserRateThrottle):scope = 'burst'class SustainedRateThrottle(UserRateThrottle):scope = 'sustained' REST_FRAMEWORK = {'DEFAULT_THROTTLE_CLASSES': ('example.throttles.BurstRateThrottle','example.throttles.SustainedRateThrottle'),'DEFAULT_THROTTLE_RATES': {'burst': '60/min','sustained': '1000/day'} }

UserRateThrottle適用于如果想簡單全局限制每位用戶的速率。

ScopedRateThrottle

ScopedRateThrottle類被用來限制訪問API的特殊部分。只有被訪問的視圖包含.throttle_scope屬性時節流才被應用。然后,通過將請求的“scope”與唯一的用戶ID或IP地址串聯,形成唯一的節流鍵。被允許的請求速率被設置里面的DEFAULT_THROTTLE_RATES決定,通過使用鍵值scope

class ContactListView(APIView):throttle_scope = 'contacts'...class ContactDetailView(APIView):throttle_scope = 'contacts'...class UploadView(APIView):throttle_scope = 'uploads'...

然后設置全局

REST_FRAMEWORK = {'DEFAULT_THROTTLE_CLASSES': ('rest_framework.throttling.ScopedRateThrottle',),'DEFAULT_THROTTLE_RATES': {'contacts': '1000/day', # 1000requests per day'uploads': '20/day' # 20request per day} }

自定義 throttles

創建一個自定義節流,重寫BaseThrottle執行.allow_request(self, request, view). 這個方法應該返回True如果請求應該被允許,否則False。同時你也需要重寫.wait()方法,如果執行,.wait()方法講返回一個推薦的的秒數在視圖下一次請求之前。.wait()方法只有在.allow_request()返回false的時候將被調用

import randomclass RandomRateThrottle(throttling.BaseThrottle):def allow_request(self, request, view):return random.randint(1, 10) != 1

?

轉載于:https://www.cnblogs.com/wuzdandz/p/9665645.html

總結

以上是生活随笔為你收集整理的Django REST Framework API Guide 07的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。