django中的中间件是什么?
是一个python类,用来在全局范围内处理
- process_request
- 执行时间:在视图函数执行前执行
- 参数:request --》视图函数中用的的request
- 执行顺序:按照注册顺序的顺序执行
- 返回值:
- None:正常流程走
- HttpRespouse对象:当前中间件后面的中间件的process_request和process_response方法和视图函数都不执行,执行当前中间件的process_response方法以及之前的中间件的process_response方法
2.process_response
- 执行时间: 在视图函数执行之后再执行
- 参数:request --》视图函数中用的的request; response–》视图函数中返回的response
- 返回值:必须是response对象
- 执行顺序:按照注册顺序倒叙执行
- process_view
- 执行时间:
- 在process_request之后,在视图函数之前执行
- 参数:
- view_func --》要执行的视图函数
- view_args --》视图函数的位置参数
- view_kwargs --》视图函数的关键字参数
- 返回值
- None:正常流程走
- 执行顺序
- 按照注册顺序执行
- process_exception
- 执行时间(触发条件:有异常才执行)
- 在视图函数之后,在process_response之前
- 参数
- exception --》 错误信息对象
- 返回值
- None 正常走
- HttpResponse对象
- 注册顺序之前的中间件process_exception方法不走了
- 执行所有中间件的process_response方法
- 执行顺序
- 按照注册顺序倒叙执行
- process_template_response
- 执行时间(触发条件:response对象要求有一个render方法)
- 在视图函数之后,在process_response之前
- 参数
- None
- 返回值
- 返回response
- 执行顺序
- 按照注册顺序倒叙执行
visit_dict = {}
# 限制一个ip 60s之内访问不能超过3次
class Throttle(MiddlewareMixin):
def process_request(self, request):
# 1.获取ip地址
ip = request.META.get('REMOTE_ADDR')
# 2.有访问记录
now = time.time() # 获取当前时间
if not visit_dict.get(ip):
visit_dict[ip] = []
history = visit_dict[ip]
print(history)
# 判断当前列表中访问当前次的访问时间或者第一次访问的时间是否大于60s
while history and now - history[-1] > 60:
# 间隔大于60s就清空列表
history.pop()
# 列表中的长度大于3
if len(history) > 2:
return HttpResponse("你的频率太快了")
# 插入到history列表中
history.insert(0, now)