对某件事情决策的范围和程度,我们叫做权限,权限是我们在项目开发中非常常用到的。

DRF框架给我们提供的权限组件

权限组件

之前DRF的版本和认证,知道了权限和频率跟版本认证都是在initial方法里初始化的

权限类一定要有has_permission方法~否则就会抛出异常~~这也是框架给我提供的钩子~~

我们先看到在rest_framework.permissions这个文件中~存放了框架给我们提供的所有权限的方法~~

权限的用法

版本-> 认证-> 权限 –> 频率

执行initial方法初始化这些组件的时候,是有顺序的,我们的版本在前面,然后是认证,然后是权限,最后是频率

我们的权限执行的时候,我们的认证已经执行结束了。

前提在model中的UserInfo表中加了一个字段用户类型的字段

权限控制类,根据request 中数据处理权限

utils/permission.py

from rest_framework.permissions import BasePermission

class MyPermission(BasePermission):
message = "您没有权限" def has_permission(self, request, view):
# 判断用户是否有权限
user_obj = request.user
if user_obj.type == 3:
return False
else:
return True

第一步 写权限类

from utils.auth import MyAuth
from utils.permission import MyPermission
class TestView(APIView):
authentication_classes = [MyAuth,] # 先登录,再判断权限
permission_classes = [MyPermission, ] # 指明权限控制类 def get(self, request):
print(request.user)
print(request.auth)
user_id = request.user.id
return Response("认证测试")

局部视图注册 authDemo/views.py

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

频率控制

开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用。

我们的DRF提供了一些频率限制的方法,我们看一下。

频率组件原理

DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通过自己定义的方法来实现。

当我们请求进来,走到我们频率组件的时候,DRF内部会有一个字典来记录访问者的IP,

以这个访问者的IP为key,value为一个列表,存放访问者每次访问的时间,

{  IP1: [第三次访问时间,第二次访问时间,第一次访问时间],}

把每次访问最新时间放入列表的最前面,记录这样一个数据结构后,通过什么方式限流呢

如果我们设置的是10秒内只能访问5次,

  -- 1,判断访问者的IP是否在这个请求IP的字典里

  -- 2,保证这个列表里都是最近10秒内的访问的时间

      判断当前请求时间和列表里最早的(也就是最后的)请求时间的查

      如果差大于10秒,说明请求以及不是最近10秒内的,删除掉,

      继续判断倒数第二个,直到差值小于10秒

  -- 3,判断列表的长度(即访问次数),是否大于我们设置的5次,

      如果大于就限流,否则放行,并把时间放入列表的最前面。

频率组件的详细用法

频率组件的配置方式其实跟上面的组件都一样,我们看下频率组件的使用。

单位时间段内限制IP的访问次数

60s内访问不得大于3次

from rest_framework.throttling import BaseThrottle, SimpleRateThrottle
import time VISIT_RECORD = {} # ip地址字典 class MyThrottle(BaseThrottle): def __init__(self):
self.history = None def allow_request(self, request, view):
# 实现限流的逻辑
# 以IP限流
# 访问列表 {IP: [time1, time2, time3]}
# 1, 获取请求的IP地址
ip = request.META.get("REMOTE_ADDR")
# 2,判断IP地址是否在访问列表
now = time.time()
if ip not in VISIT_RECORD:
# --1, 不在 需要给访问列表添加key,value
VISIT_RECORD[ip] = [now,]
return True
# --2 在 需要把这个IP的访问记录 把当前时间加入到列表
history = VISIT_RECORD[ip]
history.insert(0, now)
# 3, 确保列表里最新访问时间以及最老的访问时间差 是1分钟
while history and history[0] - history[-1] > 60:
history.pop()
self.history = history # 更新访问列表
print(history,print(VISIT_RECORD[ip]))
# 4,得到列表长度,判断是否是允许的次数。 60s秒内不得超过三次请求
if len(history) > 3:
return False
else:
return True def wait(self):
# 返回需要再等多久才能访问
time = 60 - (self.history[0] - self.history[-1])
return time

自定义的频率限制类

REST_FRAMEWORK = {
# ......
# 频率限制的配置
"DEFAULT_THROTTLE_CLASSES": ["Throttle.throttle.MyThrottle"],
}
}

配置自定义频率限制

class TestView(APIView):
authentication_classes = [MyAuth,]
permission_classes = [MyPermission, ]
throttle_classes = [MyThrottle, ] def get(self, request):
print(request.META)
print(request.user)
print(request.auth)
user_id = request.user.id
return Response("认证测试")

使用自定义频率限制

框架实现的限流类

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_VERSIONING_CLASS": "utils.version.MyVersion",
"DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.QueryParameterVersioning",
"DEFAULT_VERSION": "v1",
"ALLOWED_VERSIONS": "v1, v2",
"VERSION_PARAM": "ver",
# "DEFAULT_AUTHENTICATION_CLASSES": ["utils.auth.MyAuth", ],
"DEFAULT_THROTTLE_RATES": {
"WD": "3/m" # 一分钟三次
}
}

6

drf6 权限和频率控制组件的更多相关文章

  1. DRF之权限认证频率组件

    概要 retrieve方法源码剖析 认证组件的使用方式及源码剖析 权限组件的使用方式及源码剖析 频率组件的使用方式及源码剖析 知识点复习回顾 Python逻辑运算 知识点复习回顾一:Python逻辑运 ...

  2. DRF 权限和频率

    Django Rest Framework 权限组件 DRF的权限 权限组件源码解析 我们之前说过了DRF的版本和认证~也知道了权限和频率跟版本认证都是在initial方法里初始化的~~ 其实我们版本 ...

  3. DRF的权限和频率

    DRF的权限 权限组件源码 权限和频率以及版本认证都是在initial方法里初始化的 我们的权限类一定要有has_permission方法~否则就会抛出异常~~这也是框架给我提供的钩子~~ 在rest ...

  4. rest-framework框架——认证、权限、频率组件

    一.rest-framework登录验证 1.models.py添加User和Token模型 class User(models.Model): name = models.CharField(max ...

  5. Django-Rest-Framework的权限和频率

    Django-Rest-Framework的权限和频率 restful framework DRF的权限 权限是什么 权限到底是是干什么用的 比如,我们申请博客的时候,一定要向管理员申请,也就是说管理 ...

  6. restful(3):认证、权限、频率 & 解析器、路由控制、分页、渲染器、版本

    models.py中: class UserInfo(models.Model): name = models.CharField(max_length=32) psw = models.CharFi ...

  7. Rest_Framework之认证、权限、频率组件源码剖析

    一:使用RestFramwork,定义一个视图 from rest_framework.viewsets import ModelViewSet class BookView(ModelViewSet ...

  8. DRF 认证 权限 视图 频率

    认证组件 使用:写一个认证类,继承BaseAuthentication 在类中写authenticate方法,把request对象传入 能从request对象中取出用户携带的token根据token判 ...

  9. django-rest-framework 基础三 认证、权限和频率

    django-rest-framework 基础三 认证.权限和频率 目录 django-rest-framework 基础三 认证.权限和频率 1. 认证 1.1 登录接口 1.2 认证 2. 权限 ...

随机推荐

  1. Includes() vs indexOf() in JavaScript

    碰到一个问题, 部分机器网页数据源不正常, 简单排查发现是使用了较新的Array.includs 方法. 查了下兼容性, chrome 需要47版本以后支持, 客户机果然是很久的43版本. 用Arra ...

  2. Java笔记Spring(一)

    一.Spring框架 源码地址:https://github.com/spring-projects/spring-framework 构建工具:Gradle,Gradle教程:https://www ...

  3. jquery:获取checked复选框的问题

    jquery:获取checked复选框的问题 功能描述:要完成一个全选的功能,但总是获取不到复选框的被选中的个数,究其原因,是Jquery中length和checked使用不当所造成的. // 获取所 ...

  4. Github使用笔记——创建远程库

    系统:CentOS7 一.yum install git 二.配置 git config --global user.name "XXX" git config -global u ...

  5. python大法好——继承、多态

    1.继承 类的继承 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制. 通过继承创建的新类称为子类或派生类,被继承的类称为基类.父类或超类. 继承语法 class 派 ...

  6. leetcode207

    拓扑排序问题. class Solution { public: bool canFinish(int numCourses, vector<pair<int, int>>&a ...

  7. netbeans 正则替换

    单引号替换为双引号: tablename1('xhw_aa')  tablename2('xhw_bb') tablename3('xhw_cc') tablename4('xhw_dd')   (t ...

  8. JavaScript: DOM Docunment

    Meaning: In browser , we exchange data using JavaScript code with user. We should know that most of ...

  9. Java语法 [开发环境搭建]

    自行百度. https://www.baidu.com 自行必应 https://cn.bing.com

  10. spring @transactional 注解事务

    1.在spring配置文件中引入<tx:>命名空间 <beans xmlns="http://www.springframework.org/schema/beans&qu ...