目录
1 背景2 概念3 访问ip限制中间件(案例)4 中间件模板
1 背景
就是在我们的项目里面,多加一段代码,可插拔式的, 一般是配置在setting.py里面,django有很多默认的中间件
2 概念
中间件就是对全局的路由进行拦截,就可以理解
3 访问ip限制中间件(案例)
class IpMiddleware(MiddlewareMixin):
visit_times = {}
def process_request(self, request):
# 执行路由之前被调用,返回None就是通过,返回HttpResponse 就是拦截成功
print("执行路由之前被调用")
# 获取远程客户端的ip地址
IPAddr = request.META['REMOTE_ADDR']
# 获取请求的路由的地址
pathinfo = request.path_info
print(IPAddr) # 127.0.0.1
print(pathinfo) # /test/
if not re.match('^/test',pathinfo):
# 如果没有匹配到
return
# 拿到现在的访问次数
times = self.visit_times.get(IPAddr,0)
self.visit_times[IPAddr] = times+1
if times<5:
return
return HttpResponse("您已经访问了"+str(times)+"次,访问被禁止")
4 中间件模板
import re
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
# 中间件就是一个类,继承父类MiddlewareMixin,重写最多的5个方法
# 就是你可以重写一个或者多个方法
class IpMiddleware(MiddlewareMixin):
visit_times = {}
def process_request(self, request):
# 执行路由之前被调用,返回None就是通过,返回HttpResponse 就是拦截成功
print("执行路由之前被调用")
# 获取远程客户端的ip地址
IPAddr = request.META['REMOTE_ADDR']
# 获取请求的路由的地址
pathinfo = request.path_info
print(IPAddr) # 127.0.0.1
print(pathinfo) # /test/
# if not re.match('^/88888',pathinfo):
# # 如果没有匹配到
# return
# # 拿到现在的访问次数
# times = self.visit_times.get(IPAddr,0)
#
# self.visit_times[IPAddr] = times+1
#
# if times<5:
# return
# return HttpResponse("您已经访问了"+str(times)+"次,访问被禁止")
def process_view(self, request, view_func, view_func_args, view_func_kwargs):
# 调用视图函数之前被调用,返回None就是通过,返回HttpResponse 就是拦截成功
print("调用视图函数之前被调用")
return None
def process_response(self, request, response):
# 所有的响应返回给浏览器之前被调用,返回HttpResponse
# 一定会走这个逻辑,即使view里面代码错了,先走错的,再走这个
# 执行路由之前被调用
# 调用视图函数之前被调用
# 我出错了
# 返回给浏览器之前,调用我了
print("返回给浏览器之前,调用我了")
return response
#
# def process_template_response(self, request, response):
# # 很少用
# # 只有我们的视图里面返回了render渲染的,才会走这个
# print("我走了render函数了")
# return None
def process_exception(self, request, exception):
# 视图里面出错了,就会自动到这个里面执行,返回HttpResponse
# 抓异常,发邮件
print("我出错了")
return None
写完之后,在setting里面进行注册
精彩文章
发表评论