正如 Cathy's aswer 中已经以评论的形式发布的那样,这非常好,但在这种特殊情况下不起作用,我在这里发布了我们当前的、略显老套的解决方案作为另一个答案:
显然,这个错误不能在 Django 的 MiddleWares 中被覆盖。这是在 \django\core\handlers\wsgi.py 中的 WSGIHandler 内部触发的 UNICODE 解码错误。准确的说是
path_info = force_unicode(environ.get('PATH_INFO', u'/'))
在 WSGIRequest 内部,这导致了问题。这基本上是 Django 的正确行为,但正如我的问题中所述,我们只是想向我们的用户展示一些比空的错误页面更有用的东西。因此,我们在将传入的 URL 请求传递给我们的 WSGIHandler 之前检查有效的 UNICODE 字符。这篇博文为我们指明了正确的方向:http ://codeinthehole.com/writing/django-nginx-wsgi-and-encoded-slashes/
因此,我们在 wsgi.py 中重新路由无效 URL,如下所示:
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
import django.core.handlers.wsgi
_application = django.core.handlers.wsgi.WSGIHandler()
# for Django 1.7+
# from django.core.wsgi import get_wsgi_application
# _application = get_wsgi_application()
from django.utils.encoding import force_unicode
def application(environ, start_response):
try:
path_info = force_unicode(environ.get('PATH_INFO', u'/'))
except:
environ['PATH_INFO'] = u'/'
return _application(environ, start_response)
相反,子类化 WSGHandler 也应该有效。在此示例中,我们只是将无效 URL 重定向到我们的站点根目录“/”。但是您也可以重定向到任何自定义错误页面 URL,或者您可以尝试清理您的 URL……它对我们有用,但也许有更好的解决方案。