Django中间件

中间件顾名思义,是介于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
原文地址:https://www.cnblogs.com/songdanlee/p/11546110.html