欢迎访问 生活随笔!

生活随笔

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

编程问答

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

发布时间:2025/3/14 编程问答 53 豆豆
生活随笔 收集整理的这篇文章主要介绍了 DRF的版本控制,认证,权限和频率限制 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

版本控制

源码解析

  

 

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

 

如何使用:

settings.py里

REST_FRAMEWORK = {# 默认使用的版本控制类'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',# 允许的版本'ALLOWED_VERSIONS': ['v1', 'v2'],# 版本使用的参数名称'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中注册模型类 # 并且进行数据迁移 # 测试我就简写了~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

写认证

# 注意我们这个认证的类必须实现的方法以及返回值 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 Trueelse: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.userreturn 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"] } 全局注册 settings.py

频率控制

 源码解析

  

 

 

 

 

 如何使用:

  自己写的

VISIT_RECORD = {} class MyThrottle(object):def __init__(self):self.history = Nonedef allow_request(self, request, view):"""自定义频率限制60秒内只能访问三次"""# 获取用户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 # 权限认证 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 # 版本控制
这些是你定义需要引入的相关模块,你也可以使用它里面自带的,一般自带的可以满足大多数情况

 

转载于:https://www.cnblogs.com/chunqiuyu/p/9901304.html

总结

以上是生活随笔为你收集整理的DRF的版本控制,认证,权限和频率限制的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。