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

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. doris 0.9.0版本docker镜像制作与使用

    1. 安装docker 详情请参见本人博客 2. 编译doris 详情请参见doris官网文档 3. 在编译好的doris output文件夹下编写两个Dockerfile 3.1  Dockerfi ...

  2. mongo官方企业版安装及数据库授权使用

    通过安装.deb包的方式,系统是Ubuntu 16.04 1. Import the public key used by the package management system.(导入包管理系统 ...

  3. redis消息通知(任务队列/优先级队列/发布订阅模式)

    1.任务队列 对于发送邮件或者是复杂计算这样的操作,常常需要比较长的时间,为了不影响web应用的正常使用,避免页面显示被阻塞,常常会将此类任务存入任务队列交由专门的进程去处理. 队列最基础的方法如下: ...

  4. 版本控制(svn、Git)环境创建

    1.SVN 2.Git last 版本控制工具应该具备的功能: 协同修改: 数据备份: 版本管理: 权限控制: 历史记录:查看修改人.修改时间.修改内容…… 分支管理:开发团队在工作过程中多条产品线同 ...

  5. python:选房抽签小工具

    1.房间号和姓名写在house_name.xls的house标签页中[注意!名字均不要改动]2.运行house.py3.当前同目录下会生成result.xls,即为结果:程序运行过程中不要打开该文件, ...

  6. JS HTML倒计时 进入页面

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  7. 深度学习原理与框架-Alexnet(迁移学习代码) 1.sys.argv[1:](控制台输入的参数获取第二个参数开始) 2.tf.split(对数据进行切分操作) 3.tf.concat(对数据进行合并操作) 4.tf.variable_scope(指定w的使用范围) 5.tf.get_variable(构造和获得参数) 6.np.load(加载.npy文件)

    1. sys.argv[1:]  # 在控制台进行参数的输入时,只使用第二个参数以后的数据 参数说明:控制台的输入:python test.py what, 使用sys.argv[1:],那么将获得w ...

  8. [C语言]进阶|链表

    --------------------------------------------------------------------------------------- 可变数组: array. ...

  9. Delphi TXLSReadWriteII2 带的demo中直接编辑XLS文件的例子

    unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ...

  10. 记账本,C,Github,util

    package util; import java.awt.Component; import java.awt.Dimension; import javax.swing.JButton; impo ...