rest framework 认证 权限 频率
认证组件
发生位置
APIview 类种的 dispatch 方法执行到 initial 方法 进行 认证组件认证
源码位置
rest_framework.authentication
源码内部需要了解的
# 用户用户自定义的重写继承类
class BaseAuthentication(object):
...
# 自定义重写的认证方法
def authenticate(self, request):... # 以下4种为自带 认证 # 基于用户名和密码的认证
class BasicAuthentication(BaseAuthentication):... # 基于 session 的认证
class SessionAuthentication(BaseAuthentication):... # 基于 token 的认证
class TokenAuthentication(BaseAuthentication):... # 基于远端服务的认证
class RemoteUserAuthentication(BaseAuthentication):...
自定义认证函数
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from api.models import * class YTAuth(BaseAuthentication):
def authenticate(self, request):
token = request.query_params.get('token')
obj = UserAuthToken.objects.filter(token=token).first()
if not obj:
return AuthenticationFailed({'code': 1001, 'erroe': '认证失败'})
return (obj.user.username, obj)
# 返回的必须是元组 然后元组的里面含有两个值 并且对应的取值是rquest.user(user对象),和reques.auth(token对象)
视图级别认证
class CommentViewSet(ModelViewSet):
queryset = models.Comment.objects.all()
serializer_class = app01_serializers.CommentSerializer
authentication_classes = [YTAuth, ]
全局认证
# 在settings.py中配置
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.YTAuth", ]
}
权限组件
发生位置
APIview 类种的 dispatch 方法执行到 initial 方法 进行 认证组件执行后,进行权限组件认证
源码位置
rest_framework.permissions
权限组件内部需要了解的
# 自定义重写的类
class BasePermission(object):
...
# 自定义重写的方法
def has_permission(self, request, view): ... # AllowAny 允许所有用户
class AllowAny(BasePermission):... # IsAuthenticated 仅通过认证的用户
class IsAuthenticated(BasePermission):... # IsAdminUser 仅管理员用户
class IsAdminUser(BasePermission):... # IsAuthenticatedOrReadOnly 认证的用户可以完全操作,否则只能get读取
class IsAuthenticatedOrReadOnly(BasePermission):...
自定义权限组件
from rest_framework.permissions import BasePermission class MyPermission(BasePermission):
message = 'VIP用户才能访问' def has_permission(self, request, view):
# 认证判断已经提供了request.user
if request.user and request.user.type == 2:
return True
else:
return False
视图级别使用自定义权限组件
class CommentViewSet(ModelViewSet):
queryset = models.Comment.objects.all()
serializer_class = app01_serializers.CommentSerializer
authentication_classes = [YTAuth, ]
permission_classes = [YTPermission, ]
全局级别使用自定义权限组件
# 在settings.py中设置rest framework相关配置项
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.YTAuth", ],
"DEFAULT_PERMISSION_CLASSES": ["app01.utils.YTPermission", ]
}
频率限制
发生位置
APIview 类种的 dispatch 方法执行到 initial 方法 进行 认证组件执行,权限组件认证后 ,进行频率组件的认证
源码位置
rest_framework.throttling
权限组件内部需要了解的
# 需要自定义重写的类
class BaseThrottle(object):
...
# 自定义频率的逻辑实现方法
def allow_request(self, request, view):
...
# 自定义 限制后逻辑实现方法
def wait(self):
... # 内置的频率控制组件 常用的是这个
class SimpleRateThrottle(BaseThrottle): ... # 其他都不怎么用
class AnonRateThrottle(SimpleRateThrottle): ... # 其他都不怎么用
class UserRateThrottle(SimpleRateThrottle): # 其他都不怎么用
class ScopedRateThrottle(SimpleRateThrottle):
自定义频率组件
import time
VISIT_RECORD = {}
class YTThrottle(object): # 直接继承 object 就可以了
def __init__(self):
self.history = None
def allow_request(self, request, view):
"""
自定义频率限制60秒内只能访问三次
"""
# 获取用户IP
ip = request.META.get("REMOTE_ADDR")
timestamp = time.time()
if ip not in VISIT_RECORD:
VISIT_RECORD[ip] = [timestamp, ]
return True
history = VISIT_RECORD[ip]
self.history = history
history.insert(0, timestamp)
while history and history[-1] < timestamp - 60:
history.pop()
if len(history) > 3:
return False
else:
return True
def wait(self):
"""
限制时间还剩多少
"""
timestamp = time.time()
return 60 - (timestamp - self.history[-1])
视图级别使用自定义频率组件
class CommentViewSet(ModelViewSet):
queryset = models.Comment.objects.all()
serializer_class = app01_serializers.CommentSerializer
throttle_classes = [YTThrottle, ]
全局级别使用自定义频率组件
# 在settings.py中设置rest framework相关配置项
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.YTAuth", ],
"DEFAULT_PERMISSION_CLASSES": ["app01.utils.YTPermission", ]
"DEFAULT_THROTTLE_CLASSES": ["app01.utils.YTThrottle", ]
}
ps:
使用内置 SimpleRateThrottle 频率控制组件
from rest_framework.throttling import SimpleRateThrottle
class VisitThrottle(SimpleRateThrottle):
scope = "xxx"
def get_cache_key(self, request, view):
return self.get_ident(request)
全局使用
# 在settings.py中设置rest framework相关配置项
REST_FRAMEWORK = {
...
"DEFAULT_THROTTLE_RATES": {
"xxx": "5/m", # 每分钟5次最多
}
}
rest framework 认证 权限 频率的更多相关文章
- restful知识点之三restframework认证-->权限-->频率
认证.权限.频率是层层递进的关系 权限业务时认证+权限 频率业务时:认证+权限+频率 局部认证方式 from django.conf.urls import url,include from djan ...
- 实战-DRF快速写接口(认证权限频率)
实战-DRF快速写接口 开发环境 Python3.6 Pycharm专业版2021.2.3 Sqlite3 Django 2.2 djangorestframework3.13 测试工具 Postma ...
- Django REST framework认证权限和限制 源码分析
1.首先 我们进入这个initial()里面看下他内部是怎么实现的. 2.我们进入里面看到他实现了3个方法,一个认证,权限频率 3.我们首先看下认证组件发生了什么 权限: 啥都没返回,self.per ...
- Django REST framework认证权限和限制和频率
认证.权限和限制 身份验证是将传入请求与一组标识凭据(例如请求来自的用户或其签名的令牌)相关联的机制.然后 权限 和 限制 组件决定是否拒绝这个请求. 简单来说就是: 认证确定了你是谁 权限确定你能不 ...
- Django REST Framework 认证 - 权限 - 限制
一. 认证 (你是谁?) REST framework 提供了一些开箱即用的身份验证方案,并且还允许你实现自定义方案. 自定义Token认证 第一步 : 建表>>>> 定义一个 ...
- 8) drf 三大认证 认证 权限 频率
一.三大认证功能分析 1)APIView的 dispath(self, request, *args, **kwargs) 2)dispath方法内 self.initial(request, *ar ...
- DRF-认证 权限 频率组件
补充 1 认证 权限 频率组件原理基本相同 2 认证相关: session cookie token 认证相关的 这里用token token 1 有时间限制,超时则失效 2 每次登录更换一个tok ...
- DRF-认证权限频率
目录 DRF-认证权限频率 认证 登录接口 认证 权限 作用 使用 频率 作用 使用 认证权限频率+五个接口 模型 视图 序列化器 认证权限频率类 配置文件 路由 DRF-认证权限频率 前后端混合开发 ...
- Django Rest Framework(认证、权限、限制访问频率)
阅读原文Django Rest Framework(认证.权限.限制访问频率) django_rest_framework doc django_redis cache doc
随机推荐
- 常用matlab函数(不定时更新)
直方图类: histc 直方图分组 示例 histc(a,0:1:10) 意义:将a(矩阵或向量)分组,分组设置为 0-1 1-2 2-3 -.. 9-10,(10-11) 百分位 prctil ...
- Android为TV端助力linux命令
从命令行push到系统目录,用户组是root,而代码里面的是个人用户组,所以要把你push进去的东西改成跟你APK一样的用户组,并且chmod -R 777 文件名修改文件的权限 修改用户组chown ...
- Android Studio 代码无提示,无颜色区分
一.问题 ①java代码没有颜色区分,统一黑色 ②代码不会联想提示,原来打前几个字母便会联想到后面的内容 二.解决 打开File,将Power save Mode的勾勾去掉
- Netty学习笔记(二) 实现服务端和客户端
在Netty学习笔记(一) 实现DISCARD服务中,我们使用Netty和Python实现了简单的丢弃DISCARD服务,这篇,我们使用Netty实现服务端和客户端交互的需求. 前置工作 开发环境 J ...
- 章节十、1-用ID和XPath、name定位元素
一.在定位元素时需要HTML标签,HTML是超文本标记语言,我们打开web网页是看到的内容就是通过html语言来实现的,按键盘“F12”调用开发者选项后,“Elements”栏中显示的就是网页的HTM ...
- Linux安装配置vsftp搭建FTP的详细配置
这里主要是说vsftp的配置:基础的可以参考Linux中VSFTP的配置 转自:https://www.jb51.net/article/103904.htm 修改配置文件 配置文件/etc/vsft ...
- 常用SMTP地址
1.QQ邮箱(mail.qq.com) POP3服务器地址:pop.qq.com(端口:110) SMTP服务器地址:smtp.qq.com(端口:25) 2.搜狐邮箱(sohu.com): POP3 ...
- AngularJS学习之旅—AngularJS Http(九)
1.AngularJS XMLHttpRequest $http 是 AngularJS 中的一个核心服务,用于读取远程服务器的数据. eg: // 简单的 GET 请求,可以改为 POST $htt ...
- Swift代理的使用
Swift代理的使用 协议规定了用来实现某一特定功能所必需的方法和属性. 任意能够满足协议要求的类型被称为遵循(conform)这个协议. 类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议 ...
- Windows server 2008R2远程桌面3389端口修改方法技巧
windows server的服务器远程桌面默认端口号是3389,在工作中经常使用远程桌面连接服务器,但是这也是常常被黑客利用的端口号,但是如何修改掉默认端口,预防被黑客利用呢? 可以如下操作配置:很 ...