版本控制app
源碼解析框架
這個框架提供了一些些版本的控制方法就在,rest_framework.versioning裏ide
如何使用:post
settings.py裏測試
REST_FRAMEWORK = { # 默認使用的版本控制類 'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning', # 容許的版本 'ALLOWED_VERSIONS': ['v1', 'v2'], # 版本使用的參數名稱 'VERSION_PARAM': 'version', # 默認使用的版本 'DEFAULT_VERSION': 'v1', }
urls.pyui
class TestView(APIView): def get(self, request, *args, **kwargs): print(request.versioning_scheme) ret = request.version if ret == "v1": return Response("版本v1的信息") elif ret == "v2": return Response("版本v2的信息") else: return Response("根本就匹配不到這個路由") request.version:是版本號 request.versioning_scheme:是一個對象,就是settings裏配置的那個方法的對象
源碼解析:url
使用方法:spa
# 先在model中註冊模型類 # 而且進行數據遷移 # 測試我就簡寫了~ class UserInfo(models.Model): username = models.CharField(max_length=32) token = models.UUIDField()
# 寫視圖類而且用post請求註冊一個用戶 class UserView(APIView): def post(self, request, *args, **kwargs): username = request.data["username"] UserInfo.objects.create(username=username, token=uuid.uuid4()) return Response("註冊成功")
寫認證3d
# 注意咱們這個認證的類必須實現的方法以及返回值 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'], # 版本使用的參數名稱 'VERSION_PARAM': 'version', # 默認使用的版本 'DEFAULT_VERSION': 'v1', # 配置全局認證 'DEFAULT_AUTHENTICATION_CLASSES': ["BRQP.utils.MyAuth", ] }
權限版本控制
源碼解析:
如何使用
class MyPermission(BasePermission): message = "VIP用戶才能訪問" def has_permission(self, request, view): """ 自定義權限只有vip用戶能訪問, 注意咱們初始化時候的順序是認證在權限前面的,因此只要認證經過~ 咱們這裏就能夠經過request.user,拿到咱們用戶信息 request.auth就能拿到用戶對象 """ if request.user and request.auth.type == 2: return True else: return False
class TestAuthView(APIView): authentication_classes = [MyAuth, ] permission_classes = [MyPermission, ] def get(self, request, *args, **kwargs): print(request.user) print(request.auth) username = request.user return Response(username)
REST_FRAMEWORK = { # 默認使用的版本控制類 'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning', # 容許的版本 'ALLOWED_VERSIONS': ['v1', 'v2'], # 版本使用的參數名稱 'VERSION_PARAM': 'version', # 默認使用的版本 'DEFAULT_VERSION': 'v1', # 配置全局認證 # 'DEFAULT_AUTHENTICATION_CLASSES': ["BRQP.utils.MyAuth", ] # 配置全局權限 "DEFAULT_PERMISSION_CLASSES": ["BROP.utils.MyPermission"] }
頻率控制
源碼解析
如何使用:
本身寫的
VISIT_RECORD = {} class MyThrottle(object): def __init__(self): self.history = None def allow_request(self, request, view): """ 自定義頻率限制60秒內只能訪問三次 """ # 獲取用戶IP ip = request.META.get("REMOTE_ADDR") timestamp = time.time() if ip not in VISIT_RECORD: VISIT_RECORD[ip] = [timestamp, ] return True history = VISIT_RECORD[ip] self.history = history history.insert(0, timestamp) while history and history[-1] < timestamp - 60: history.pop() if len(history) > 3: return False else: return True def wait(self): """ 限制時間還剩多少 """ timestamp = time.time() return 60 - (timestamp - self.history[-1])
REST_FRAMEWORK = { # ...... # 頻率限制的配置 "DEFAULT_THROTTLE_CLASSES": ["Throttle.throttle.MyThrottle"], } }
使用自帶的
from rest_framework.throttling import SimpleRateThrottle class 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 # 權限認證 from rest_framework.authentication import BaseAuthentication # 用戶認證 from rest_framework.exceptions import AuthenticationFailed # 用戶認證必須使用的報錯 from rest_framework.throttling import SimpleRateThrottle # 設置訪問頻率 from app01 import models from rest_framework.versioning import BaseVersioning # 版本控制這些是你定義須要引入的相關模塊,你也能夠使用它裏面自帶的,通常自帶的能夠知足大多數狀況