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

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. RHEL7调图形化

    RHEL7调图形化 作者:Eric 微信:loveoracle11g 1.将默认的运行级别修改为"多用户,无图模式" [root@server ~]# ln -sf /lib/sy ...

  2. 使用redis-cli --pipe快速插入数据

    具体实现步骤如下:(参考http://www.cnblogs.com/ivictor/p/5446503.html) 1. 新建一个文本文件redis_commands.txt,包含redis命令 S ...

  3. CountDownLatch两种用法

    1.当前线程等待其他线程执行完毕后在执行. 2.模拟高并发场景. 在多线程编程里,CountDownLatch是一个很好的计数器工具. 常用的两个方法: 1.计数器减一 public void cou ...

  4. Tomcat的简单归纳总结

    2017年08月09日 12:39:23 大道之简 阅读数:1072    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/HcJsJqJSSM/ar ...

  5. openStack instance error 恢复

    cli command下加载openstack超级管理员权限 重设openStack 虚拟机error实例状态即可 nova reset-state instance-id --active

  6. jpg转yuv420抠图后转为jpg

    最近遇到个需求,已有全景图和其中的人脸坐标,将人脸小图从全景图中抠出来,最开始使用libjpeg,奈何使用libjpeg将jpg转为yuv420的资料实在少,libjpeg自身的readme和exam ...

  7. itextsharp图片生成pdf模糊问题解释

    I forget to mention that I' am using itextsharp 5.0.2. It turned out that PDF DPI = 110, which means ...

  8. Spring MVC和Spring Boot的理解以及比较

    Spring MVC是什么?(1)Spring MVC是Spring提供的一个强大而灵活的模块式web框架.通过Dispatcher Servlet, ModelAndView 和 View Reso ...

  9. uname命令详解

    1.简介: uname命令用于打印当前系统相关信息(内核版本号.硬件架构.主机名称和操作系统类型等). 2.命令语法: uname (选项) 3.选项: -a或--all:显示全部的信息: -m或-- ...

  10. 38.Spring-spring和hibernate整合.md

    目录 1.定义各种类对象 2.创建Hibernate配置文件 3.配置applicationContext.xml 4.注意事项 1.定义各种类对象 package per.liyue.sh.demo ...