中间件的使用二(设置访问频率)

限制访问频率主要作用:防止爬虫不停的访问你的网站,造成服务器崩掉的,可以参考rest-framework中访问频率

一、访问频率限制的主要思想(一分钟访问3次)

  • 1、用户群体区分

    • 1.匿名用户(就是没有登录的用户)--->根据用户访问ip来判断
    • 2.登录用户--->根据用户名来判断
  • 2、主要步骤

    • 1.创建一个访问历史大字典
    • 2.根据第一点识别用户
    • 3.如果用户之前没访问过就直接允许访问
    • 4.获取用户访问时间列表
    • 5.如果时间列表存在且最早一次访问时间比现在时间小于60s就删除这项
    • 6.当历史记录小于3次的时候就在第一个位置插入当前时间

二、具体实现代码

  • 1、导包

    import time
    
    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import redirect, HttpResponse
    
  • 2、实现代码

    VISIT_RECORD = {}
    
    class ThrottlingMiddleWare(MiddlewareMixin):
        """
        定义一个访问频率的中间件
        """
    
        def process_request(self, request):
            # 1.获取用户名或者ip
            username = request.user.username
            remote_addr = request.META.get('REMOTE_ADDR', None)
    
            # 2.获取当前用户
            curret_user = username if username else remote_addr
            _len = 5 if username else 3
    
            ctime = time.time()
    
            # 3.判断当前用户ip是否在历史记录中
            if curret_user not in VISIT_RECORD:
                VISIT_RECORD[curret_user] = [ctime]
                return None
    
            # 4.获取之前的访问时间
            history = VISIT_RECORD.get(curret_user)
            # 5. 如果之前访问的时间小于当前时间-60(表示是在60秒前访问),就删除最早访问时间
            while history and history[-1] < ctime - 60:
                history.pop()
    
            # 6.如果是登录用户就限制5次普通用户限制3次
            if len(history) < _len:
                history.insert(0, ctime)
                return None
            # 7.如果不符合就重定向到百度,或者返回HttpResponse
            return redirect('https://www.baidu.com')
    
  • 3、注册

    MIDDLEWARE = [
    
        ...
        'middle.cors_middle_ware.CORSMiddleWare',  # 自定义跨域中间件
        'middle.throttling_middle_ware.ThrottlingMiddleWare',  # 自定义访问频率的中间件
    ]
    

results matching ""

    No results matching ""