一、权限

权限可以限制用户对视图的访问和对具体数据对象的访问。

  • 在执行视图的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之权限和频率限制的更多相关文章

  1. DRF的权限和频率

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

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

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

  3. DRF 认证 权限 视图 频率

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

  4. DRF之权限认证频率组建

    认证组件 很久很久以前,Web站点只是作为浏览服务器资源(数据)和其他资源的工具,甚少有什么用户交互之类的烦人的事情需要处理,所以,Web站点的开发这根本不关心什么人在什么时候访问了什么资源,不需要记 ...

  5. DRF 权限和频率

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

  6. drf6 权限和频率控制组件

    对某件事情决策的范围和程度,我们叫做权限,权限是我们在项目开发中非常常用到的. DRF框架给我们提供的权限组件 权限组件 之前DRF的版本和认证,知道了权限和频率跟版本认证都是在initial方法里初 ...

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

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

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

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

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

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

随机推荐

  1. stress工具使用指南和结果分析(好好好测试通过)

    stress工具使用指南和结果分析 佛心看世界关注 0.1152019.05.13 09:17:35字数 547阅读 1,112 #stress `stress' imposes certain ty ...

  2. Elasticsearch + Logstash + Kibana +Redis +Filebeat 单机版日志收集环境搭建

    1.前置工作 1.虚拟机环境简介 Linux版本:Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:2 ...

  3. 大师画PCB板子

    1.低频电路对于模拟地和数字地要分开布线,不能混用 2.如果有多个A/D转换电路,几个ADC尽量放在一起,只在尽量靠近该器件处单点接地,AGND和DGND都要接到模拟地,电源端子都要接到模拟电源端子: ...

  4. python工业互联网应用实战16-前后端分离模式之修改与删除

    前一章节介绍了List页面的JQuery技术栈的迁移,这一章节我们花一些篇幅来说说修改/查看页面的技术栈迁移.相对于List的获取数据,修改页面涉及到数据Post提交到后台更新数据库.我们仍旧小步迭代 ...

  5. mysql数据库-备份方式简介与规范

    目录 1 应对场景: 2. 备份方式分类 2.1 按备份数据类型划分 2.2 按侵入程度划分 2.3 按备份方式划分 3 备份注意要点 4 还原要点 4.1 定期还原测试,验证备份可用性 4.2 还原 ...

  6. 使用Selenium从IEEE与谷歌学术批量爬取BibTex文献引用

    搞科研的小伙伴总是会被期刊严苛的引用文献格式搞的很头疼.虽然常用的文献软件可以一键导出BibTex,但由于很多论文在投稿之前都会先发上Arxiv占坑,软件就很可能会把文献引出为来自Arxiv.我用的是 ...

  7. Python小白的数学建模课-05.0-1规划

    0-1 规划不仅是数模竞赛中的常见题型,也具有重要的现实意义. 双十一促销中网购平台要求二选一,就是互斥的决策问题,可以用 0-1规划建模. 小白学习 0-1 规划,首先要学会识别 0-1规划,学习将 ...

  8. Pandas之:Pandas高级教程以铁达尼号真实数据为例

    Pandas之:Pandas高级教程以铁达尼号真实数据为例 目录 简介 读写文件 DF的选择 选择列数据 选择行数据 同时选择行和列 使用plots作图 使用现有的列创建新的列 进行统计 DF重组 简 ...

  9. Docker学习(14) Docker容器的数据管理

    Docker容器的数据管理 Docker容器的数据卷 重要: Docker的数据卷容器 Docker数据卷的备份和还原

  10. 什么是 Web 服务器(server)

    首先我们来了解什么是服务器(server) Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,[1]也可以放置网站文件,让全世界浏览:可以放置数 ...