process_request process_view在处理响应时,调用视图函数之后,会依次从下到上(和调用正好相反),处理 MDDLEWARE中声明的各个中间件,这其中会有三个钩子函数被执行分别如下:
process_exception process_template_response process_response五个钩子函数的具体作用介绍如下:
django.utils.deprecation.MiddlewareMixin
并在自定义类中实现适合的钩子函数。中间件类须实现五个钩子函数中的一个或者多个,通常中间件定义在 middleware 目录中,和项目应用属于同级,该目录需要我们自己新建。在目录中定义中间件文件 mymiddleware.py 并将其注册在 settings.py 文件的 MIDDLEWARE 列表中。自定义中间件的格式如下:from django.http import HttpResponse from django.utils.deprecation import MiddlewareMixin class MyMiddleWare(MiddlewareMixin): def process_request(self, request): print("中间件方法 process_request 被调用") def process_view(self, request, callback, callback_args, callback_kwargs): print("中间件方法 process_view 被调用") def process_response(self, request, response): print("中间件方法 process_response 被调用") return response def process_exception(self, request, exception): print("中间件方法 process_exception 被调用") def process_template_response(self, request, response): print("中间件方法 process_template_response 被调用") return response
import time from django.http import HttpResponse from django.utils.deprecation import MiddlewareMixin # 限制用户访问次数,每60秒不超过5次 #构建访问者IP池 visit_ip_pool = {}#以'ip'地址为键,以访问的网站的时间戳列表作为值形如{'127.0.0.1':[时间戳,...]} class VisitLimitMiddleWare(MiddlewareMixin): def process_request(self, request): #获取用户的访问的ip地址 ip = request.META.get("REMOTE_ADDR") #获取访问时间 visit_time = time.time() if ip not in visit_ip_pool: #维护字典,将新的ip地址加入字典 visit_ip_pool[ip] = [visit_time] else: #已经存在,则将ip对应值的插入列表开始位置 visit_ip_pool[ip].insert(0, visit_time) #获取ip_list列表 ip_list = visit_ip_pool[ip] #计算访问时间差 lead_time= ip_list[0] - ip_list[-1] print('地址:', ip, '访问次数:', len(ip_list), '时间差', lead_time) #两个条件同时成立则,间隔时间在60s内 while ip_list and lead_time > 60: #默认移除列表中的最后一个元素 ip_list.pop() #间隔在60s内判断列表的长度即访问的次数是否大于5次 if len(ip_list) > 5: return HttpResponse("对不起,访问过于频繁,将终止你的访问请求...") print('地址:', ip, '访问次数:', len(ip_list), '时间差', lead_time)上述代码完成了对用户访问网站次数的限制。定义完成后,需要在 settings.py 中的 MIDDLEWARE 列表完成注册,如下所示:
'middleware.mymiddleware.VisitLimitMiddleWare'
在运行项目时,中间件会自动加载执,你可以对原来的编写视图函数进行访问,你会发现在 CMD 命令行工具中,有如下显示:System check identified no issues (0 silenced). July 21, 2020 - 15:36:32 Django version 2.2.10, using settings 'BookStore.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK. 地址: 127.0.0.1 访问次数: 1 时间差 0.0 地址: 127.0.0.1 访问次数: 1 时间差 0.0当你访问过于频繁,将终止你的访问请求。
本文链接:http://task.lmcjl.com/news/16788.html