我正在开发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
但是! MiddlewareMixin
与deprecation
utils相关并用于兼容性目的:
Django提供
django.utils.deprecation.MiddlewareMixin
轻松 创建与MIDDLEWARE
兼容的中间件类 和旧MIDDLEWARE_CLASSES
。
问题:如何在Django v1.11中正确定义中间件类?
答案 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