DRF之权限和频率限制
一、权限
权限可以限制用户对视图的访问和对具体数据对象的访问。
- 在执行视图的dispatch方法前,会先进行视图访问权限的判断
- 在通过get_object获取对象时,会进行模型对象访问权限的判断
源码分析
核心源码——>APIView——>dispatch——>initial——>self.check_permissions(request)
def check_permissions(self, request):
# 遍历权限对象列表得到一个个权限对象(权限器),进行权限认证
for permission in self.get_permissions():
# 权限类一定要有一个has_permission权限方法,用来做权限认证的
# 参数:权限对象self、请求对象request、视图类对象view
"""
has_permission(self, request, view):
"""
# 返回值:有权限返回True、无权限返回False
if not permission.has_permission(request, self):
self.permission_denied(
request,
message=getattr(permission, 'message', None),
code=getattr(permission, 'code', None)
)
权限使用
写一个类,继承BasePermission,重写has_permission,如果权限通过,就返回True,不通过就返回False。
from rest_framework.permissions import BasePermission
class UserPermission(BasePermission):
def has_permission(self, request, view):
# 由于已经认证过了,request内就已经有了user对象了,当前用户
user = request.user # 当前登录用户
# 如果该字段用了choice,那么可以使用get_字段名_display(),取出choice后面的中文
print(user.get_user_type_display())
if user.user_type == 1: # 不是超级用户不能访问
return True
else:
return False
如何使用:
# 局部使用
from app01.app01_auth import UserPermission
class TestView(APIView):
authentication_classes = [TokenAuthentication] # 认证配置
permission_classes = [UserPermission] # 权限配置
# 全局使用
REST_FRAMEWORK={
"DEFAULT_AUTHENTICATION_CLASSES":[
"app01.app01_auth.TokenAuthentication", # 全局认证配置
],
'DEFAULT_PERMISSION_CLASSES': [
'app01.app01_auth.UserPermission', # 全局权限配置
],
}
# 局部禁用 settings.py
class TestView(APIView):
permission_classes = [] # 局部禁用权限配置
内置权限
内置权限类
from rest_framework.permissions import AllowAny,IsAuthenticated,IsAdminUser,IsAuthenticatedOrReadOnly
- AllowAny 允许所有用户
- IsAuthenticated 仅通过认证的用户
- IsAdminUser 仅管理员用户
- IsAuthenticatedOrReadOnly 已经登陆认证的用户可以对数据进行增删改操作,没有登陆认证的只能查看数据。
如何使用
# 1 创建超级管理员 >>python manage.py createsuperuser
from rest_framework.permissions import IsAdminUser
from rest_framework.authentication import SessionAuthentication
class TestView(APIView):
authentication_classes=[SessionAuthentication,]
permission_classes = [IsAdminUser]
def get(self,request,*args,**kwargs):
return Response('这是测试数据,超级管理员可以看')
# 3 超级用户登录到admin,再访问test就有权限
# 4 正常的话,普通管理员,没有权限看(判断的是is_staff字段)
二、频率
可以用来减轻服务器压力,对接口访问的频率进行限制
内置频率限制
由于大部分需求使用内置的频率限制就已经可以了,所以主要看看内置的频率限制
限制未登录用户:AnonRateThrottle
也就是限制所有匿名未认证用户,使用IP区分用户。anon
设置频次
# 全局使用 settings.py
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.AnonRateThrottle',
),
'DEFAULT_THROTTLE_RATES': {
'anon': '5/m', # 每分钟访问次数
}
}
# views.py
from rest_framework.views import APIView
class TestView(APIView):
def get(self, request):
return Response('我是未登录用户,每分钟只能访问5次')
# -------------------------------------------------------------------
# 局部使用
# 还是需要先在settings.py中配置访问次数
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_RATES': {
'anon': '5/m',
}
}
# views.py
from rest_framework.throttling import AnonRateThrottle
from rest_framework.views import APIView
class TestView(APIView):
throttle_classes = [AnonRateThrottle] # 局部使用
def get(self, request):
return Response('我是未登录用户,每分钟只能访问5次')
限制登录用户:UserRateThrottle
需求:未登录用户1分钟访问5次,登录用户一分钟访问10次
对认证用户限制,使用User id 来区分,user
设置频次
但是这个有局限性,它只能是auth_user表,admin这套系统才能使用
# 全局使用 settings.py
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.AnonRateThrottle', # 未登录用户
'rest_framework.throttling.UserRateThrottle' # 登录用户
),
'DEFAULT_THROTTLE_RATES': {
'user': '10/m', # 登录用户频率
'anon': '5/m', # 未登录用户频率
}
}
from rest_framework.views import APIView
class TestView(APIView):
def get(self, request):
return Response('未登录用户5次,登录之后10次')
IP频率限制:SimpledRateThrottle
限制用户对于每个视图的访问频率,使用IP限制
# 1、写一个类,继承SimpleRateThrottle,重写 get_cache_key
# app01_auth.py
from rest_framework.throttling import SimpleRateThrottle
class App01_Throttle(SimpleRateThrottle):
scope = 'luffy'
def get_cache_key(self, request, view):
# 返回什么源码中的key就是什么
return request.META.get('REMOTE_ADDR')
# 2、全局配置频率次数 settings.py
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_RATES': {
'luffy': '5/m' # key要根据类中的scope对应
},
}
# 3、局部使用 views.py
from rest_framework.views import APIView
from app01.app01_auth import App01_Throttle
class TestView(APIView):
throttle_classes = [App01_Throttle] # 局部使用配置
def get(self, request):
return Response('IP限制每分钟访问5次')
# 全局使用需要在settings.py配置
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
'app01.app01_auth.App01_Throttle', # 全局及配置
),
'DEFAULT_THROTTLE_RATES': {
'luffy': '5/m' # key要根据类中的scope对应
},
}
DRF之权限和频率限制的更多相关文章
- DRF的权限和频率
DRF的权限 权限组件源码 权限和频率以及版本认证都是在initial方法里初始化的 我们的权限类一定要有has_permission方法~否则就会抛出异常~~这也是框架给我提供的钩子~~ 在rest ...
- DRF之权限认证频率组件
概要 retrieve方法源码剖析 认证组件的使用方式及源码剖析 权限组件的使用方式及源码剖析 频率组件的使用方式及源码剖析 知识点复习回顾 Python逻辑运算 知识点复习回顾一:Python逻辑运 ...
- DRF 认证 权限 视图 频率
认证组件 使用:写一个认证类,继承BaseAuthentication 在类中写authenticate方法,把request对象传入 能从request对象中取出用户携带的token根据token判 ...
- DRF之权限认证频率组建
认证组件 很久很久以前,Web站点只是作为浏览服务器资源(数据)和其他资源的工具,甚少有什么用户交互之类的烦人的事情需要处理,所以,Web站点的开发这根本不关心什么人在什么时候访问了什么资源,不需要记 ...
- DRF 权限和频率
Django Rest Framework 权限组件 DRF的权限 权限组件源码解析 我们之前说过了DRF的版本和认证~也知道了权限和频率跟版本认证都是在initial方法里初始化的~~ 其实我们版本 ...
- drf6 权限和频率控制组件
对某件事情决策的范围和程度,我们叫做权限,权限是我们在项目开发中非常常用到的. DRF框架给我们提供的权限组件 权限组件 之前DRF的版本和认证,知道了权限和频率跟版本认证都是在initial方法里初 ...
- rest-framework框架——认证、权限、频率组件
一.rest-framework登录验证 1.models.py添加User和Token模型 class User(models.Model): name = models.CharField(max ...
- Django-Rest-Framework的权限和频率
Django-Rest-Framework的权限和频率 restful framework DRF的权限 权限是什么 权限到底是是干什么用的 比如,我们申请博客的时候,一定要向管理员申请,也就是说管理 ...
- restful(3):认证、权限、频率 & 解析器、路由控制、分页、渲染器、版本
models.py中: class UserInfo(models.Model): name = models.CharField(max_length=32) psw = models.CharFi ...
随机推荐
- HC-05底层驱动
INT8U BT_INIT(const char * pNAME, INT32U BAUD, INT8U ROLE, INT32U PSWD) { INT8U OS_ERR = OS_ERR_NONE ...
- 分布式锁中的王者方案-Redisson
上篇讲解了如何用 Redis 实现分布式锁的五种方案,但我们还是有更优的王者方案,就是用 Redisson. 缓存系列文章: 缓存实战(一):20 图 |6 千字|缓存实战(上篇) 缓存实战(二):R ...
- Angular环境搭建及简单体验
一.安装开发环境 npm install -g typescript npm install -g @angular/cli 二.创建hello-world项目 创建项目 ng new angular ...
- React-setState的那些事儿
关于setState,使用过react的人应该再熟悉不过了,在hooks还不那么普及的时候,除了使用函数式组件,我们使用最多的应该就是类创建react的组件了,而在类组件中我们通常会使用state来管 ...
- Geo-CNN的三维点云
Geo-CNN的三维点云 Modeling Local Geometric Structure of 3D Point Clouds using Geo-CNN 摘要 深度卷积神经网络(CNNs)的最 ...
- Spring Cloud系列(四):断路器Hystrix
上一篇介绍了负载均衡的配置方法,做负载均衡是为了保证高可用性,但是有时候服务提供者挂掉了,比如服务A调用了服务B,服务B又调用了服务C,然后有一天服务C的所有节点都挂掉了,这时服务B就会因为C异常而在 ...
- mybatis学习——映射器(mappers)
在定义 SQL 映射语句之前,我们需要告诉 MyBatis 到哪里去找到这些语句. 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射 ...
- 【NX二次开发】导出x_t、导入x_t例子,UF_PS_export_data、UF_PS_import_data
获取blockUI 体收集器选择的体,导出x_t: std::vector<TaggedObject*>objects = bodySelect0->GetSelectedObjec ...
- 【VBA】模块更新方法
删除模块,重新导入 1 Sub 更新模块() 2 With ThisWorkbook.VBProject 3 .VBComponents.Remove .VBComponents("模块1& ...
- spring boot 加载web容器tomcat流程源码分析
spring boot 加载web容器tomcat流程源码分析 我本地的springboot版本是2.5.1,后面的分析都是基于这个版本 <parent> <groupId>o ...