Django Wagtail Middleware kicks error: status_code not defined in response

Django Wagtail Middleware kicks error: status_code not defined in response

我正在将一个项目升级到 Django 1.11。我重写了一个似乎可以正常工作的自定义站点中间件;但是,我不确定它是否会导致下游出现问题。这段自定义中间件的名字来源于Django和Wagtail的中间件。然而,我得到的错误来自 Wagtail 的重定向中间件:

'NoneType' object has no attribute 'status_code'

这是完整的跟踪:

Traceback (most recent call last):
  File "/home/vagrant/.virtualenvs/wrds/lib/python3.5/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/home/vagrant/.virtualenvs/wrds/lib/python3.5/site-packages/django/utils/deprecation.py", line 142, in __call__
    response = self.process_response(request, response)
  File "/home/vagrant/.virtualenvs/wrds/lib/python3.5/site-packages/wagtail/wagtailredirects/middleware.py", line 30, in process_response
    if response.status_code != 404:
AttributeError: 'NoneType' object has no attribute 'status_code'

这是导致错误的 Wagtail 的中间件代码;我注意到它正在使用弃用 Mixin:

# Originally pinched from: https://github.com/django/django/blob/master/django/contrib/redirects/middleware.py
class RedirectMiddleware(MiddlewareMixin):
    def process_response(self, request, response):
        # No need to check for a redirect for non-404 responses.
        if response.status_code != 404: ...
            return response
        # If a middleware before `SiteMiddleware` returned a response the
        # `site` attribute was never set, ref #2120
        if not hasattr(request, 'site'):
            return response

有没有人运行以前参与过这个?

我想通了 - 这是我的中间件。在响应(中间件的后半部分)中,我有一个 return None 来自旧式中间件的 process_request() in __call__:

# BROKEN - RETURNS None
def __call__(self, request):
    if request.user.is_authenticated():
        # If they're already auth'd, don't bother checking.
        return None

中间件class对象需要return响应:

# FIXED - RETURNS self.get_response(request)
def __call__(self, request):
    if request.user.is_authenticated():
        # If they're already auth'd, don't bother checking.
        return self.get_response(request)

如果您 运行 陷入此错误,响应周期中的前一个中间件(在 MIDDLEWARE[] 中报告错误的中间件之前列出的那个)将是罪魁祸首!祝你好运。

我在这里找到了答案,为我解决了这个问题:

Your 404 handler must return a response with status_code=404, otherwise the Wagtail redirect middleware will not work.