如何在Django v1.11中正确定义中间件类?

时间:2017-08-21 15:10:56

标签: python django django-middleware

我正在开发Django(v1.11)项目,需要为网站提供一些中间件功能。此版本的Django会修改docs中所述的旧MIDDLEWARE_CLASSES设置:

  

引入了一种新的中间件用于新的中间件   MIDDLEWARE设置。

然而,我无法理解新中间件如何工作。阅读完中间件文档后,我得出以下结论:

class FooMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        return self.get_response(request)

    def process_template_response(self, request, response):
        # do something here
        return response

我认为它可以正常工作,但不幸的是上面的代码无法正常工作并且被Django完全忽略(没有任何错误!)。

当我做以下事情时:

class FooMiddleware(object):    
    def process_template_response(self, request, response):
        # do something here
        return response

...发生错误(因为__init__类的object方法没有参数):

  

TypeError:object()不带参数

当我更改代码时,一切正常

from django.utils.deprecation import MiddlewareMixin

class FooMiddleware(MiddlewareMixin):
    def process_response(self, request, response):
        # do something here
        return response

但是! MiddlewareMixindeprecation utils相关并用于兼容性目的:

  

Django提供django.utils.deprecation.MiddlewareMixin轻松   创建与MIDDLEWARE兼容的中间件类   和旧MIDDLEWARE_CLASSES

问题:如何在Django v1.11中正确定义中间件类?

1 个答案:

答案 0 :(得分:3)

定义process_template_response仅在您的响应实例具有render()方法时才有用。如果没有,您应该将自定义代码移到__call__方法中。

class FooMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        # Do something here
        return response