rest_framework 节流功能(访问频率)
访问记录 = {
身份证号: [ :: ,::, ::]
}
#:: ,::,:: ,::,
#::
#[::, ::, ::]
#访问记录 = {
用户IP: [...]
}
import time
VISIT_RECORD = {} #存放IP的数据库 可以放在缓存!
from rest_framework.thrittling import BaseThrottle
class VisitThrattle(object):
def __init__(self):
self.history = None
def allow_request(self, request, view):
"""
写一些业务逻辑
获取用户IP地址
60s内只能访问3次
"""
remote_addr = request._request.META.get('REMOTE_ADDR')
print(remote_addr) #访问记录IP
ctime = time.time()
if remote_addr not in VISIT_RECORD:
VISIT_RECORD[remote_addr] = [ctime,] #表示第一次访问
return True
history = VISIT_RECORD.get(remote_addr)
self.history = history
while history and history[[-] < ctime -:
history.pop()
if len(history) < :
history.insert(, ctime)
return True
return False
return True #判断是否可以继续访问 True可以访问 频率没有达到最大
#return False如果返回False频率太高,已经被限制 无法继续下一步访问
def wait(self):
#显示还需要等多少秒
ctime = time.time()
return = - (ctime - self.history[-])
class AuthView(APIView):
authentication_calsses = []
permission_classes = []
throttle_classes = [VisitThrattle,]
def post(self, request, *args, **kwargs):
#去 request获取IP
#访问记录
全局配置的话
REST_FRAMEWORK = {
"DEFAULT_THROTTLE_CLASSES" : ['api.utlis.throttle.VisitThrottle']
}
内置控制频率的类:
BaseThrottle SimpleRateThrottle(BaseThrottle) allow_request
from rest_framework.throttling import BaseThrottle, SimpleRateThrottle
class VisitThrottle(SimpleRateThrottle): #对匿名用户的ip号通过时间做访问频率控制
scope = 'Luffy' #指定setting配置文件中Luffy(key)
def get_cache_key(self, request, view): #去缓存里取数据
return self.get_ident(request)
class UserThrottle(SimpleRateThrottle): #对用户的名字 通过时间做访问频率控制
scope = "LuffyUser"
def get_cache_key(self, request, view):
return request.user.username
然后再views.py添加
from api.utils.throttle import UserThrottle
在创建的函数里添加
throttle_classes = ["UserThrottle"]
在setting.py加
REST_FRAMEWORK = {
"DEFAULT_THROTTLE_CLASSES":['api.utils.throttle.VisitThrottle'],
"DEFAULT_THROTTLE_RATES":{
"Luffy":'3/m' #每分钟访问3次 #duration = {'s':, 'm':, 'h':, 'd':}[period[]]
"LuffyUser": /m
}
}
梳理:
a. 基本使用
-类, 继承BaseThrottle 实现 allow_request wait 两个方法 加个__init__构造函数
-类, 继承SimpleRateThrottle 实现 get_cache_key scope = "Luffy" (配置文件中的key)
b. 局部使用
class AuthView(APIView):
throttle_classes = [ VisitThrottle, ] #>>>>>>
全局
REST_FRAMEWORK = {
"DEFAULT_THROTTLE_CLASSES":['api.utils.throttle.VisitThrottle'],
"DEFAULT_THROTTLE_RATES":{
"Luffy":'3/m' #每分钟访问3次 #duration = {'s':, 'm':, 'h':, 'd':}[period[]]
"LuffyUser": /m
}
}
rest_framework 节流功能(访问频率)的更多相关文章
- rest_framework 访问频率(节流)流程
访问频率流程 访问频率流程与认证流程非常相似,只是后续操作稍有不同 当用发出请求时 首先执行dispatch函数,当执行当第二部时: #2.处理版本信息 处理认证信息 处理权限信息 对用户的访问频率进 ...
- rest_framework组件之认证,权限,访问频率
共用的models from django.db import models # Create your models here. class User(models.Model): username ...
- RestFramework自定制之认证和权限、限制访问频率
认证和权限 所谓认证就是检测用户登陆与否,通常与权限对应使用.网站中都是通过用户登录后由该用户相应的角色认证以给予对应的权限. 权限是对用户对网站进行操作的限制,只有在拥有相应权限时才可对网站中某个功 ...
- Django REST framework 自定义(认证、权限、访问频率)组件
本篇随笔在 "Django REST framework 初识" 基础上扩展 一.认证组件 # models.py class Account(models.Model): &qu ...
- 从FBV到CBV四(访问频率限制)
比如我们有一个用户大转盘抽奖的功能,需要规定用户在一个小时内只能抽奖3次,那此时对接口的访问频率限制就显得尤为重要 其实在restframework中已经为我们提供了频率限制的组件 先捋一下请求到AP ...
- DRF框架之 用户角色权限与访问频率的权限设置
1. 简单演示,创建一个models的数据库表 class User(models.Model): name=models.CharField(max_length=32) pwd=models.Ch ...
- cache 访问频率的思考
互联网的项目用户基数很大,有时候瞬间并发量非常大,这个时候对于数据访问来说是个灾难.为了应对这种场景,一般都会大量采用web服务器集群,缓存集群.采用集群后基本上就能解决大量并发的数据访问.当然这个时 ...
- django Rest Framework----认证/访问权限控制/访问频率限制 执行流程 Authentication/Permissions/Throttling 源码分析
url: url(r'books/$',views.BookView.as_view({'get':'list','post':'create'})) 为例 当django启动的时候,会调用执行vie ...
- Redis 实现接口访问频率限制
为什么限制访问频率 做服务接口时通常需要用到请求频率限制 Rate limiting,例如限制一个用户1分钟内最多可以范围100次 主要用来保证服务性能和保护数据安全 因为如果不进行限制,服务调用者可 ...
随机推荐
- 洛谷 P2393 yyy loves Maths II
P2393 yyy loves Maths II 题目背景 上次蒟蒻redbag可把yyy气坏了,yyy说他只是小学生,蒟蒻redbag这次不坑他了. 题目描述 redbag给了yyy很多个数,要yy ...
- nyoj 1189 yougth和他的朋友们 (DP)
题目:pid=1189" target="_blank">nyoj 1189 yougth和他的朋友们 这题目是14年北京赛区的原题.讲题的时候说有三种解法,我们是 ...
- 晋IT分享成长沙龙集锦
第一期"晋IT"分享成长沙龙于2014年7月19日圆满结束.下面是相关内容整理和第二期预告. 各位伙伴认真的介绍自己,介绍自己的业务,分析自己眼下存在的问题,大家一起探讨,真诚出谋 ...
- node 内存消息队列
var net = require('net') var clients = [] ,msgs = {} function unWrapMsg(data){ data = data.toString( ...
- 开源ETL工具kettle--数据迁移
背景 因为项目的需求,须要将数据从Oracle迁移到MSSQL,不是简单的数据复制,而是表结构和字段名都不一样.甚至须要处理编码规范不一致的情况,例如以下图所看到的 watermark/2/text/ ...
- dom 编程(html和xml)
html dom与xml dom关系: 什么是 DOM? DOM 是 W3C(万维网联盟)的标准. DOM 定义了訪问 HTML 和 XML 文档的标准: "W3C 文档对象模型 (DOM) ...
- [bzoj 1398] Vijos1382寻找主人 Necklace 解题报告(最小表示法)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1398 题目: Description 给定两个项链的表示,判断他们是否可能是一条项链. ...
- cookie、sessionStorage和localStorage
title: cookie.sessionStorage和localStorage toc: false date: 2018-09-25 16:49:57 cookie 由于HTTP协议是无状态的, ...
- 配置NTP集群时间同步(二)
[root@hadoop1 bin]# rpm -qa|grep ntp 没有的话用yum -y install ntp安装(要记着每台机器上都要安装) [root@hadoop1 bin]# vi ...
- 根据ip地址获取城市
var ip=context.Request.UserHostAddress; string url = "http://int.dpool.sina.com.cn/iplookup/ipl ...