DRF的版本控制,认证,权限和频率限制
生活随笔
收集整理的這篇文章主要介紹了
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.pyurls.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.pyDRF的認證
源碼解析:
?
?
?
?
使用方法:
# 先在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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: URAL - 1114-Boxes (
- 下一篇: 4. 垃圾回收- 4.3垃圾收集器