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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DRF的版本控制,认证,权限和频率限制

發(fā)布時間:2025/3/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DRF的版本控制,认证,权限和频率限制 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

版本控制

源碼解析

  

?

這個框架提供了一些些版本的控制方法就在,rest_framework.versioning里

?

如何使用:

settings.py里

REST_FRAMEWORK = {# 默認使用的版本控制類'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',# 允許的版本'ALLOWED_VERSIONS': ['v1', 'v2'],# 版本使用的參數(shù)名稱'VERSION_PARAM': 'version',# 默認使用的版本'DEFAULT_VERSION': 'v1', } settings.py

urls.py

?

class TestView(APIView):def get(self, request, *args, **kwargs):print(request.versioning_scheme)ret = request.versionif ret == "v1":return Response("版本v1的信息")elif ret == "v2":return Response("版本v2的信息")else:return Response("根本就匹配不到這個路由")request.version:是版本號 request.versioning_scheme:是一個對象,就是settings里配置的那個方法的對象 views.py

DRF的認證

源碼解析:

?

?

?

?

使用方法:

# 先在model中注冊模型類 # 并且進行數(shù)據(jù)遷移 # 測試我就簡寫了~class UserInfo(models.Model):username = models.CharField(max_length=32)token = models.UUIDField() models.py # 寫視圖類并且用post請求注冊一個用戶class UserView(APIView):def post(self, request, *args, **kwargs):username = request.data["username"]UserInfo.objects.create(username=username, token=uuid.uuid4())return Response("注冊成功") views.py

寫認證

# 注意我們這個認證的類必須實現(xiàn)的方法以及返回值 class MyAuth(BaseAuthentication):def authenticate(self, request):request_token = request.query_params.get("token", None)if not request_token:raise AuthenticationFailed({"code": 1001, "error": "缺少token"})token_obj = UserInfo.objects.filter(token=request_token).first()if not token_obj:raise AuthenticationFailed({"code": 1001, "error": "無效的token"})return token_obj.username, token_obj 寫一個認證的類 class TestAuthView(APIView):authentication_classes = [MyAuth, ]def get(self, request, *args, **kwargs):return Response("測試認證") 局部配置 REST_FRAMEWORK = {# 默認使用的版本控制類'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',# 允許的版本'ALLOWED_VERSIONS': ['v1', 'v2'],# 版本使用的參數(shù)名稱'VERSION_PARAM': 'version',# 默認使用的版本'DEFAULT_VERSION': 'v1',# 配置全局認證'DEFAULT_AUTHENTICATION_CLASSES': ["BRQP.utils.MyAuth", ] } 全局配置認證

權(quán)限

源碼解析:

  

?

?

?

?

?

?

?如何使用

class MyPermission(BasePermission):message = "VIP用戶才能訪問"def has_permission(self, request, view):"""自定義權(quán)限只有vip用戶能訪問,注意我們初始化時候的順序是認證在權(quán)限前面的,所以只要認證通過~我們這里就可以通過request.user,拿到我們用戶信息request.auth就能拿到用戶對象"""if request.user and request.auth.type == 2:return Trueelse:return False 第一步 寫權(quán)限類 class TestAuthView(APIView):authentication_classes = [MyAuth, ]permission_classes = [MyPermission, ]def get(self, request, *args, **kwargs):print(request.user)print(request.auth)username = request.userreturn Response(username) 局部視圖注冊 REST_FRAMEWORK = {# 默認使用的版本控制類'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',# 允許的版本'ALLOWED_VERSIONS': ['v1', 'v2'],# 版本使用的參數(shù)名稱'VERSION_PARAM': 'version',# 默認使用的版本'DEFAULT_VERSION': 'v1',# 配置全局認證# 'DEFAULT_AUTHENTICATION_CLASSES': ["BRQP.utils.MyAuth", ]# 配置全局權(quán)限"DEFAULT_PERMISSION_CLASSES": ["BROP.utils.MyPermission"] } 全局注冊 settings.py

頻率控制

?源碼解析

  

?

?

?

?

?如何使用:

  自己寫的

VISIT_RECORD = {} class MyThrottle(object):def __init__(self):self.history = Nonedef allow_request(self, request, view):"""自定義頻率限制60秒內(nèi)只能訪問三次"""# 獲取用戶IPip = request.META.get("REMOTE_ADDR")timestamp = time.time()if ip not in VISIT_RECORD:VISIT_RECORD[ip] = [timestamp, ]return Truehistory = VISIT_RECORD[ip]self.history = historyhistory.insert(0, timestamp)while history and history[-1] < timestamp - 60:history.pop()if len(history) > 3:return Falseelse:return Truedef wait(self):"""限制時間還剩多少"""timestamp = time.time()return 60 - (timestamp - self.history[-1]) 自定義的頻率限制類 REST_FRAMEWORK = {# ......# 頻率限制的配置"DEFAULT_THROTTLE_CLASSES": ["Throttle.throttle.MyThrottle"],} } settings.py  

  使用自帶的

from rest_framework.throttling import SimpleRateThrottleclass MyVisitThrottle(SimpleRateThrottle):scope = "WD"def get_cache_key(self, request, view):return self.get_ident(request) 使用自帶的頻率限制類 REST_FRAMEWORK = {# 頻率限制的配置# "DEFAULT_THROTTLE_CLASSES": ["Throttle.throttle.MyVisitThrottle"],"DEFAULT_THROTTLE_CLASSES": ["Throttle.throttle.MyThrottle"],"DEFAULT_THROTTLE_RATES":{'WD':'5/m', #速率配置每分鐘不能超過5次訪問,WD是scope定義的值, } } 配置頻率限制

?

?

?

from rest_framework.permissions import BasePermission # 權(quán)限認證 from rest_framework.authentication import BaseAuthentication # 用戶認證 from rest_framework.exceptions import AuthenticationFailed # 用戶認證必須使用的報錯 from rest_framework.throttling import SimpleRateThrottle # 設(shè)置訪問頻率 from app01 import models from rest_framework.versioning import BaseVersioning # 版本控制
這些是你定義需要引入的相關(guān)模塊,你也可以使用它里面自帶的,一般自帶的可以滿足大多數(shù)情況

?

轉(zhuǎn)載于:https://www.cnblogs.com/chunqiuyu/p/9901304.html

總結(jié)

以上是生活随笔為你收集整理的DRF的版本控制,认证,权限和频率限制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。