权限

权限逻辑

权限逻辑

权限组件可以设置在三个地方:
写在每个类下边表示,访问这个类的数据时,没有权限就不能访问;
写在全局,表示访问每个字段的数据都需要权限;还有默认已经也写好了。 写在每个类中:写一个权限组件,套入到需要加权限的类中,组件中写业务逻辑。
业务逻辑:首先提前在user用户中加入字段user_type,
写好type=((1,"VIP"),(2,"SVIP"),(3,"SSVIP")),user_type=models.IntegerField(choices=type),
当user_type>=2时,表示可以访问资源,按照源码流程,直接返回True即可,反之亦然。
#url.py
url(r'^course/', views.Courseview.as_view()),
#views.py
class SSVIPPermission(object):
def get_permissions(self,request,view): #源码中抠的函数,view可有可无,一般不用
if request.user.user_type>=2:
return True #源码中,如果权限user_type大于等于2,相当于是svip、ssvip,表示可以访问资源;
                                          
return False #返回False表示无权限 class Courseview(APIView): permission_classes=[SSVIPPermission] #将权限组件加入course这个资源类。
def get(self,request): # 使用序列化传数据
course_list=Course.objects.all()
cs=CourseSerializer(course_list,many=True) #如果有多个字段,不可能使用course.desc这种方式,
                                                 需要序列化简便!
print(cs.data)
return Response(cs.data) #我的序列化接口 def post(self,request): print(request.data)
cs=CourseSerializer(data=request.data)
if cs.is_valid(): #校验
Course.objects.create(**request.data)
return Response(cs.data) #序列化数据
else:
return Response(cs.errors) # 序列化错误信息

权限源码

    def check_permissions(self, request):
for permission in self.get_permissions():
if not permission.has_permission(request, self):
self.permission_denied(
request, message=getattr(permission, 'message', None)
) 解析:当调用get_permissions()时,若get_permissions()被返回了True,permission为True,接下来的代码就不走了,
可以直接访问数据了,若返回False,代表要走if not...语句,返回message错误提醒。
另外message可以自己写,一般是英文,可以写出中文加到SSVIPPermission类下。

频率

访问频率逻辑

流程基本上是:当用户访问数据时,要获取ip地址,和当前访问时间戳,存放到字典里。当第一次访问时,将访问的ip地址创建到字典里,
接着做判断,当第一次访问时间和最后一次访问时间间隔大于60s,那么就无权限访问了,然后将访问间隔大于60的用户ip地址删除掉,
继续访问即可!

首先定义个VISIT_RECORD字典用来存放ip地址、当前访问的时间戳。

#一分钟一个IP只能访问3次的配置
from rest_framework.throttling import BaseThrottle
VISIT_RECORD={}
class VisitThrottle(BaseThrottle): def __init__(self):
self.histroy = None def allow_request(self, request, view): remote_addr=request.META.get("REMOTE_ADDR")
print(remote_addr) #取到访问用户的ip地址
import time
ctime=time.time()
print(ctime) #当前时间戳 if remote_addr not in VISIT_RECORD:
VISIT_RECORD[remote_addr]=[ctime,] #将第一次访问,字典里没有IP地址,则创建当前ip地址。
# 再将{"127.0.0.1":1544185712.4733276}
                              放到VISIT_RECORD字典
return True history=VISIT_RECORD.get(remote_addr)
self.histroy=history while history and history[-1]<ctime-60: #当当前的用户访问时间大于60了,删除这个ip记录
history.pop() if len(history)<3:
history.insert(0,ctime) #如果一分钟内访问了3次以下,插入记录,返回True,继续访问
return True
else: #如果一分钟内访问了3次以上,返回False
return False def wait(self):
import time
ctime=time.time()
return 60-(ctime-self.histroy[-1])
class Courseview(APIView):

    throttle_classes = [VisitThrottle]  #频率组件
def get(self,request): course_list=Course.objects.all()
cs=CourseSerializer(course_list,many=True) #如果有多个字段,不可能使用course.desc这种方式,
                                需要序列化简便!
print(cs.data)
return Response(cs.data) #我的序列化接口 def post(self,request): print(request.data)
cs=CourseSerializer(data=request.data)
if cs.is_valid(): #校验
Course.objects.create(**request.data)
return Response(cs.data) #序列化数据
else:
return Response(cs.errors) # 序列化错误信息

使用频率组件

#url.py
url(r'^course/', views.Courseview.as_view()),
#settings.py
'DEFAULT_THROTTLE_CLASSES':("app01.views.VisitThrottle",),
'DEFAULT_THROTTLE_RATES':{
"visit_rate":"6/m", #visit_rate可以随便起名,在views中设置
}
#访问频率的配置-使用组件
from rest_framework.throttling import SimpleRateThrottle
class VisitThrottle(SimpleRateThrottle): #访问频率封装在SimpleRateThrottle方法里
scope="visit_rate" #可以设置字段 def get_cache_key(self, request, view):
return self.get_ident(request) #拿到ip地址

AI-DRF权限、频率的更多相关文章

  1. DRF 权限 频率

    DRF的权限 权限是什么 大家之前都应该听过权限~那么我们权限到底是做什么用的呢~~ 大家都有博客~或者去一些论坛~一定知道管理员这个角色~ 比如我们申请博客的时候~一定要向管理员申请~也就是说管理员 ...

  2. DRF 权限和频率

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

  3. 实战-DRF快速写接口(认证权限频率)

    实战-DRF快速写接口 开发环境 Python3.6 Pycharm专业版2021.2.3 Sqlite3 Django 2.2 djangorestframework3.13 测试工具 Postma ...

  4. DRF之频率限制、分页、解析器和渲染器

    一.频率限制 1.频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 2.频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通 ...

  5. DRF 权限的流程

    DRF 权限的流程 django rest framework,入口是 dispatch,然后依次 --->>封装请求--->>处理版本--->>>认证--- ...

  6. DRF-认证权限频率

    目录 DRF-认证权限频率 认证 登录接口 认证 权限 作用 使用 频率 作用 使用 认证权限频率+五个接口 模型 视图 序列化器 认证权限频率类 配置文件 路由 DRF-认证权限频率 前后端混合开发 ...

  7. python 全栈开发,Day97(Token 认证的来龙去脉,DRF认证,DRF权限,DRF节流)

    昨日内容回顾 1. 五个葫芦娃和三行代码 APIView(views.View) 1. 封装了Django的request - request.query_params --> 取URL中的参数 ...

  8. restful知识点之三restframework认证-->权限-->频率

    认证.权限.频率是层层递进的关系 权限业务时认证+权限 频率业务时:认证+权限+频率 局部认证方式 from django.conf.urls import url,include from djan ...

  9. DRF 用户频率限制

    DRF 用户频率限制 为什么要限流 1 防爬虫 匿名用户 无法限制,代理 已登录,用户名限制:买代理 2 提供服务(接口--不同用户的访问次数不一样) vip 限制访问次数 BaseThrottle ...

  10. DRF-认证 权限 频率组件

    补充 1 认证 权限 频率组件原理基本相同 2 认证相关: session cookie token 认证相关的  这里用token token 1 有时间限制,超时则失效 2 每次登录更换一个tok ...

随机推荐

  1. Django学习手册 - admin后台 切换成中文显示/添加数据表

    Django admin后台管理 切换成中文界面: 站点显示为中文: 在setting 里面修改 LANGUAGE_CORE = 'zh-Hans' 字段名显示中文 class Test(models ...

  2. Service生命周期

    https://www.cnblogs.com/huihuizhang/p/7623760.html (1)Service是单例的,只要没有destroy,多次startService或bindSer ...

  3. Linux C++ TCP Socket传输文件或图片实例

    环境:Linux 语言:C++ 通信方式:TCP 下面用TCP协议编写一个简单的服务器.客户端,其中服务器端一直监听本机的6666号端口.如果收到连接请求,将接收请求并接收客户端发来的消息:客户端与服 ...

  4. Navicat for MySQL 12中文版 破解流程

    1.下载  Keygen_Patch 软件 下载地址 pass: saxz 2.启动 Keygen_Patch 软件 3.提示破解成功了,先别着急 4.运行 Navica  软件,输入注册码 5.断网 ...

  5. longzhuapp项目笔记

    1.配置不同环境的打包命令

  6. better-scroll和swiper使用中的坑

    better-scroll  1.我的 better-scroll 初始化了, 但是没法滚动. 按照文档使用后,发现可以原生滚动,但是不能弹性滑动,后面发现是最外层容器没给设置固定高度   ,设置固定 ...

  7. MongoVUE 使用教程

    MongoVUE是一款针对MongoDB的客户端工具,现在连接数据库也叫数据模式有2种方法,一种是B/S结构的数据库,通过网页就可以访问.另外一种就是基于C/S客户端的连接方式,本次为大家分享的这一个 ...

  8. UVALive 8513 lovers 2017 西安区域赛 B 贪心+multiset

    UVALive 8513 有2种人,每个人有自己的权值$A_i$ $B_i$ 当$A_i + B_i >=K$时 两个人可以配对 问最多多少人可以配对 解法 : 把$/{ A_i /}$ 排序 ...

  9. mysql的group by查询

    下面是多种写法,针对使用group by后得到最新记录的测试及结果: 说明:我在测试的时候,因为我的表数据在增加,得到最新的数据可能不同 -- 1.得到每个分组中id最小的那条记录 select * ...

  10. SQL Server异常汇总

    1.特定用户名无法访问数据库 例如需要使用sa用户名访问School数据库失败,提示如下: (你要设置的)数据库--属性--文件--所用者设为Sa,回到用户映射查看,已勾选上. 还有一些情况 1)将登 ...