• 中间件方法
    • Initializer: init(self) init(self)「初始化]
    • Request预处理函数: process_request(self, request) process_request(self, request)
    • View预处理函数: process_view(self, request, view, args, kwargs) process_view(self, request, view, args, kwargs)
    • Response后处理函数: process_response(self, request, response) process_response(self, request, response)
    • Exception后处理函数: process_exception(self, request, exception) process_exception(self, request, exception)

    中间件方法

    现在,我们已经知道什么是中间件和怎么安装它,下面将介绍中间件类中可以定义的所有方法。

    Initializer: init(self) init(self)「初始化]

    在中间件类中, init() 方法用于执行系统范围的设置。

    出于性能的考虑,每个已启用的中间件在每个服务器进程中只初始化 次。 也就是说 init() 仅在服务进程启动的时候调用,而在针对单个request处理时并不执行。

    对一个middleware而言,定义 init() 方法的通常原因是检查自身的必要性。 如果 init() 抛出异常 django.core.exceptions.MiddlewareNotUsed ,则Django将从middleware栈中移出该middleware。 可以用这个机制来检查middleware依赖的软件是否存在、服务是否运行于调试模式、以及任何其它环境因素。

    在中间件中定义 init() 方法时,除了标准的 self 参数之外,不应定义任何其它参数。

    Request预处理函数: process_request(self, request) process_request(self, request)

    这个方法的调用时机在Django接收到request之后,但仍未解析URL以确定应当运行的view之前。 Django向它传入相应的 HttpRequest 对象,以便在方法中修改。

    process_request() 应当返回 NoneHttpResponse 对象.

    • 如果返回 None , Django将继续处理这个request,执行后续的中间件, 然后调用相应的view.

    • 如果返回 HttpResponse 对象, Django 将不再执行 任何 其它的中间件(而无视其种类)以及相应的view。 Django将立即返回该 HttpResponse .

    View预处理函数: process_view(self, request, view, args, kwargs) process_view(self, request, view, args, kwargs)

    这个方法的调用时机在Django执行完request预处理函数并确定待执行的view之后,但在view函数实际执行之前。

    表15-1列出了传入到这个View预处理函数的参数。

    表 15-1. 传入process_view()的参数
    参数说明
    requestThe HttpRequest object.
    viewThe Python function that Django will call to handle this request. This is the actual function object itself, not the name of the function as a string.
    args将传入view的位置参数列表,但不包括request 参数(它通常是传 入view的第一个参数)
    kwargs将传入view的关键字参数字典.

    Just like process_request() , process_view() should return either None or an HttpResponse object.

    • If it returns None , Django will continue processing this request, executing any other middleware and then the appropriate view.

    • If it returns an HttpResponse object, Django won’t bother calling any other middleware (of any type) or the appropriate view. Django will immediately return that HttpResponse .

    Response后处理函数: process_response(self, request, response) process_response(self, request, response)

    这个方法的调用时机在Django执行view函数并生成response之后。 Here, the processor can modify the content of a response. One obvious use case is content compression, such as gzipping of the request’s HTML.

    这个方法的参数相当直观: request 是request对象,而 response 则是从view中返回的response对象。 request is the request object, and response is the response object returned from the view.

    不同可能返回 None 的request和view预处理函数, processresponse() 必须_ 返回 HttpResponse 对象. 这个response对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。 That response could be the original one passed into the function (possibly modified) or a brand-new one.

    Exception后处理函数: process_exception(self, request, exception) process_exception(self, request, exception)

    这个方法只有在request处理过程中出了问题并且view函数抛出了一个未捕获的异常时才会被调用。 这个钩子可以用来发送错误通知,将现场相关信息输出到日志文件, 或者甚至尝试从错误中自动恢复。

    这个函数的参数除了一贯的 request 对象之外,还包括view函数抛出的实际的异常对象 exception

    process_exception() 应当返回 None 或 HttpResponse 对象.

    • 如果返回 None , Django将用框架内置的异常处理机制继续处理相应request。

    • 如果返回 HttpResponse 对象, Django 将使用该response对象,而短路框架内置的异常处理机制。

    备注

    Django自带了相当数量的中间件类(将在随后章节介绍),它们都是相当好的范例。 阅读这些代码将使你对中间件的强大有一个很好的认识。

    在Djangos wiki上也可以找到大量的社区贡献的中间件范例: http://code.djangoproject.com/wiki/ContributedMiddlewarehttp://code.djangoproject.com/wiki/ContributedMiddleware