中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能。
中间件一个面向对象的类,当中包含五个公共方法
Process_request 在请求后,process_views之前,执行views函数之前执行的方法
Process_views 在请求Process_request后,执行views函数之前执行的方法
Views 视图
Process_exception 视图处理之后,响应响应之前之前
Process_template_response process_exception之后渲染模板之前
Process_response 返回response之前
在项目主目录下创建middleware.py 文件
代码如下
from django.utils.deprecation import MiddlewareMixin from django.http import HttpResponse from Qshop.settings import ERROR_PATH import time class MiddleWareTest(MiddlewareMixin): def process_request(self,request): ip = request.META.get("REMOTE_ADDR") print("我是process_request") if ip == "10.10.14.167": return HttpResponse("<h1>非法ip</h1>") def process_view(self,request,callback,callback_args,callback_kwargs): """ :param request:请求 :param callback: 对应视图函数,访问那个视图就是那个视图 :param callback_args: 视图函数对应的参数 元组类型 :param callback_kwargs: 视图函数的参数, 字典类型 :return: """ print("我是process_view") print(callback) def process_exception(self,request,exception): """ 出现异常执行 :param excetion: :return: """ if exception: with open(ERROR_PATH,"a") as f: now = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) content = "[%s]:%s "%(now,exception) f.write(content) # 发送邮件 return HttpResponse("代码出错了%s"%exception) def process_template_response(self,request,response): """ 必须返回一个render才可以触发 :param request: :param response: :return: """ print("我是process_template_response") return HttpResponse("123") def process_response(self,request,response): """ process_response 和 process_template_response必须有返回值 :param request: :param response: :return: """ print("process_response") return response
process_template_process 必须有返回值 必须对象中要有render方法
settings配置
views.py
# def middle_test_view(request): # print("我是view") # return JsonResponse({"data":"hello"}) # 用来测试process_template_response def middle_test_view(request): def hello(): return HttpResponse("hello world") rep = HttpResponse("nihao") rep.render = hello return rep