throttle_classes 60秒访问10次限制

model:

class LoginModel(models.Model):

username = models.CharField(max_length=32)
password = models.CharField(max_length=32)
type_choice = (
(0, "普通用户"),
(1, "VIP"),
(2, "SVIP"),
)
user_type = models.IntegerField(choices=type_choice)
ip_addr = models.CharField(max_length=32)
visits = models.IntegerField()

def __str__(self):
return self.username



自定义类
LOGIN_CODE = {}
class FrequencyThrottles:

def allow_request(self, request, view):
ip_addr = request.META.get("REMOTE_ADDR")

if ip_addr:

models.LoginModel.objects.filter(ip_addr=ip_addr).update(visits=F("visits") + 1)
visit_times = models.LoginModel.objects.filter(username=request.user).first().visits
if ip_addr not in LOGIN_CODE:
LOGIN_CODE[ip_addr] = {}
if not LOGIN_CODE[ip_addr]:
LOGIN_CODE[ip_addr]["limit_time"] = datetime.datetime.now() + datetime.timedelta(seconds=60)
LOGIN_CODE[ip_addr]["visit_times"] = visit_times + 10
LOGIN_CODE[ip_addr]["blacklist"] = []
elif datetime.datetime.now() <= LOGIN_CODE[ip_addr]["limit_time"] and visit_times >= LOGIN_CODE[ip_addr][
"visit_times"] and ip_addr not in LOGIN_CODE[ip_addr]["blacklist"]:
LOGIN_CODE[ip_addr]["blacklist"].append(ip_addr)
if datetime.datetime.now() > LOGIN_CODE[ip_addr]["limit_time"] :
LOGIN_CODE[ip_addr] = {}

if ip_addr not in LOGIN_CODE[ip_addr].get("blacklist", []):
return True
else:
return False

def wait(self):
pass

转载于:https://www.cnblogs.com/louzi/p/9649678.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值