基于IP限制用户访问

2020-02-05 22:27:30 最后一行代码 阅读:459

分类: Django

 

封装代码:

class RestrictUserAccess:
    def __init__(self, req, data, limit, count):
        self.req = req                
        self.data = data
        self.limit = limit
        self.count = count             
        self.t = time.time()           
    
    def _get_IP(self):
        # 判断项目是否使用负载均衡
        if self.req.META.get('HTTP_X_FORWARDED_FOR'):                  
            ip = self.req.META['HTTP_X_FORWARDED_FOR'].split(",")[0]
        else:
            ip = self.req.META['REMOTE_ADDR']
        return ip

    def allow_request(self): 
        ip = self._get_IP()                        
        if ip not in self.data:                   
            self.data[ip] = [self.t,]   
            return True

        self.list_time = self.data.get(ip)                          
        while self.list_time and self.list_time[-1] < self.t-self.limit:    
            self.list_time.pop()
        
        if len(self.list_time) < self.count:                
            self.list_time.insert(0,self.t)
            return True
        return False

    def surplus(self):
        # 提示文字在这里自定义就行
        return '访问频繁请%s秒后重试' % int(self.limit-(self.t-self.list_time[-1]))   

 

实现逻辑:

实现逻辑并不难,就是将访问用户IP及每次访问的时间记录下来,每次访问的时间戳都保存在列表中,判断列表最后一个时间戳是否<当前访问时间-限制时间,条件成立说明在限制时间内访问的,删除列表最后一个时间戳。如果记录访问时间戳列表中元素数量在限制范围内,则在列表开头添加当前访问的时间戳。

 

参数说明:

req            视图函数request对象

data          用于记录访问用户IP的空字典(传递的变量必须在视图函数外面,否则每次刷新都会覆盖前面记录的数据)

limtit         限制多少秒内允许访问

count        限制limtit秒内最大访问次数

 

方法属性:

._get_IP()               获取访问用户IP

.allow_request()     是否允许访问,返回布尔值

.surplus()               返回拒绝访问时提示文字及多少秒后可以继续访问

 

调用:

# views.py
from django.http import HttpResponse

data = {}
def index(request):
    r = RestrictUserAccess(request, data, 60, 5)
    if not r.allow_request():
        return HttpResponse(a.surplus())

 

回复:

快来抢沙发

老板赏瓶水呗
微信 微信 支付宝 支付宝