中间件的使用二(设置访问频率)
限制访问频率主要作用:防止爬虫不停的访问你的网站,造成服务器崩掉的,可以参考rest-framework
中访问频率
一、访问频率限制的主要思想(一分钟访问3次)
1、用户群体区分
- 1.匿名用户(就是没有登录的用户)--->根据用户访问
ip
来判断 - 2.登录用户--->根据用户名来判断
- 1.匿名用户(就是没有登录的用户)--->根据用户访问
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', # 自定义访问频率的中间件 ]