DRF之访问权限控制和访问频率控制(节流)
权限控制
前言
用户验证用户权限,根据不同访问权限控制对不同内容的访问。
建议了解视图、token验证的内容。
使用流程
- 自定义访问权限类,继承
BasePermission
,重写has_permission()
方法,如果权限通过,就返回True
,不通过就返回False
。has_permission()
方法接受两个参数,分别是request
和view
,也就是视图类的实例化本身。
- 配置。
局部配置:
permission_classes = [MyUserPermission]
全局配置:
REST_FRAMEWORK={
'DEFAULT_PERMISSION_CLASSES': ['libs.MyAuth.UserPermission',],
}
示例
class SVIPPermission(BasePermission): # 推荐继承BasePermission类
# message = 'You do not have permission to perform this action.'#默认值
message = '无此权限!!!'
def has_permission(self, request, view):
if request.user.user_type == 3:
return False # False为没权限
# view.queryset = # 可以使用这种方式控制视图中要处理的数据(根据不同权限)
return True # True为有权限
源码分析
进入dispatch
函数,查看initial
方法(执行三大验证)中的check_permissions
方法:
self.check_permissions(request)
将会根据request
中的用户内容进行权限控制。
由上可知,permission_classes
要么读取配置文件中的DEFAULT_PERMISSION_CLASSES
(全局),要么就在视图类中直接对permission_classes
赋值(局部)。
节流限制
前言
控制网站访问频率。
使用流程
- 自定义限制类,继承
BaseThrottle
。 - 指定从配置文件中要读取的scope(key),形式为
scope="key"
全局配置:
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle'
],
'DEFAULT_THROTTLE_RATES': {
'anon': '100/day',
'user': '1000/day'
}
}
局部配置:
throttle_classes = [UserRateThrottle]
就比如UserRateThrottle
,继承了SimpleRateThrottle
,指定了它所限制的scope
,重写了get_cache_key
方法。
源码分析
在APIView
的initial
方法中,三大验证还剩下最后一个没有分析,那就是访问频率验证,如下图:
接下来让我们查看check_throttles
,可以看到,验证访问频率的时候,调用的方法为频率验证类的allow_request
方法。
其中get_throttles
用的还是老套路:
示例
自定义一个频率限制类:
from rest_framework.throttling import BaseThrottle
import time
# 存放访问记录(一般放数据库或者缓存中)
VISIT_RECORD = {}
class VisitThrottle(BaseThrottle):
def __init__(self):
self.history = None
def allow_request(self, request, view):
# 1. 获取用户ip
remote_addr = request.META.get("REMOTE_ADDR")
# 2. 添加到访问记录中
ctime = time.time()
# 当VISIT_RECORD中没有这个记录,可以直接访问,添加一个记录
if remote_addr not in VISIT_RECORD:
VISIT_RECORD[remote_addr] = [ctime, ]
return True
history = VISIT_RECORD.get(remote_addr)
self.history = history
# 拿到最后历史记录里面的最后一个时间,如果最后一个时间小于当前时间-60(一分钟之前的记录)
while history and history[-1] < ctime - 60:
history.pop()
if len(history) < 3: # 允许
history.insert(0, ctime)
return True
return False # False表示访问频率太高被限制
def wait(self):
"""
还需要等多少秒可以访问
:return:
"""
ctime = time.time()
return 60 - (ctime - self.history[-1])
注意:官方内置的 SimpleRateThrottle
类中对scope
的处理值得一看。
DRF之访问权限控制和访问频率控制(节流)的更多相关文章
- Chapter6_访问权限控制_访问权限修饰词
Java中有四种访问权限,public,private,protected和包访问权限,它们是置于类中每一个成员之前的定义,无论是一个域还是一个方法,下面一一介绍. 一.包访问权限 如果不提供任何访问 ...
- MongoDB 安全和访问权限控制
MongoDB的访问控制能够有效保证数据库的安全,访问控制是指绑定Application监听的IP地址,设置监听端口,使用账户和密码登录 一,访问控制的参数 1,绑定IP地址 mongod 参数:-- ...
- (转)浅析Java中的访问权限控制
原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...
- 使用nginx和iptables做访问权限控制(IP和MAC)
之前配置的服务器,相当于对整个内网都是公开的 而且,除了可以通过80端口的nginx来间接访问各项服务,也可以绕过nginx,直接ip地址加端口访问对应服务 这是不对的啊,所以我们要做一些限制 因为只 ...
- [THINKING IN JAVA]访问权限控制
6 访问权限控制 6.1 包:库单元 package.import.import *.import static: 修改classpath环境变量可以将自己写的类库添加至环境变量并在任何java程序中 ...
- Java成员的访问权限控制
Java中的访问权限控制包含两个部分: 类的访问权限控制 类成员的访问权限控制 对类来说,访问权限控制修饰符可以是public或者无修饰符(默认的包访问权限): 对于类成员来说,访问权限控制修饰符可以 ...
- 浅析Java中的访问权限控制
浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...
- redis密码设置、访问权限控制等安全设置
redis作为一个高速数据库,在互联网上,必须有对应的安全机制来进行保护,方法有2,如下. 1.比较安全的办法是采用绑定IP的方式来进行控制. 请在redis.conf文件找到如下配置 # If y ...
- JAVA访问权限控制[zhuan]
Java的访问权限控制修饰符,从最大权限到最小权限依次是:public.protected.包访问权限(默认,没有关键字)和private.对于类的访问权限只能是:public和包访问权限(但内部类可 ...
随机推荐
- windows cmd 链接远程mysql服务器
我要链接的mysql 所在ip:192.168.0.110 用户名:root 密码:123 那么: 打开cmd 输入: mysql -h192.168.0.110 -uroot -p123 即 ...
- COMMENT SQL二次注入
这题目太顶了进去随便发个贴,出现登录已经提示用户名和密码了,弱密码登录(得自己去爆破)zhangwei666即可 没啥思路,扫下目录试试,kali的dirb扫到.git泄露githacker得到源码看 ...
- CobaltStrike 生成office宏病毒进行钓鱼攻击
关于WORD宏: 在百度百科上有: 宏是一个批量处理程序命令,正确地运用它可以提高工作效率.微软的office软件允许用户自己编写,叫VBA的脚本来增加其灵活性,进一步扩充它的能力.如完打开word文 ...
- 半夜删你代码队 Day4冲刺
一.每日站立式会议 1.站立式会议 成员 昨日完成工作 今日计划工作 遇到的困难 陈惠霖 做了新规划 开始双人合作 无 侯晓龙 写了第一个例子 开始双人合作 无 周楚池 准备合作 开始双人合作 无 胡 ...
- AcWing 180. 排书
AStar 最坏情况\(O(log_2560 ^ 4)\) 用\(AStar\)算法做了这题,程序跑了\(408ms\). 相比于\(IDA*\)的\(100ms\)左右要慢上不少. 且\(A*\)由 ...
- 一、java多线程编程核心技术之(笔记)——多线程的实现
概念:可以理解为在进程中独立运行的子任务.比如,QQ.exe在运行时就有很多子任务在运行,好友视屏线程,下载文件线程,传输数据线程等等. 优点:1.提升CPU资源利用率,提升系统性能. 一.多线程的实 ...
- Echarts入门教程精简实用系列
引语:echarts.js是百度团队推出的一款用于图表可视化的插件,用于以图表的形式展现数据,功能强大,上手简单 1.从官方网站中下载所需的echarts.js文件,该文件因功能广泛,包体较大,可自行 ...
- 简单的一段css代码让全站变灰,网站哀悼代码
为表达全国各族人民对抗击新冠肺炎疫情斗争牺牲烈士和逝世通报的深切哀悼,国务院今天发布公告,决定2020年4月4日举行全国性哀悼活动.在此期间,全国和驻外使馆下半旗致哀,全国停止公共娱乐活动,4月4日1 ...
- 【Jenkins】环境配置及安装
下载地址: 国外官网:https://www.jenkins.io/zh/download/(版本最新) 国内镜像:http://mirrors.jenkins-ci.org/windows/ 清华镜 ...
- 【面试专栏】JAVA CAS(Conmpare And Swap)原理
1. CAS简介 在计算机科学中,比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令.它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新 ...