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.
我正在将一个项目升级到 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.