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当你访问过于频繁,将终止你的访问请求。
版权说明:Copyright © 广州松河信息科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州松河信息科技有限公司 版权所有