如在凱蒂的aswer那纔是真的好評論的形式已經發布,但在這種特殊情況下不工作,我在這裏發佈我們的電流,稍hackish的解決方案,另一種答案:
顯然,這個錯誤不能在Django的MiddleWares中重寫。這是一個UNICODE解碼錯誤,它在\ django \ core \ handlers \ wsgi.py中的WSGIHandler內部觸發。確切地說,這是導致問題的內部WSGIRequest,它是
path_info = force_unicode(environ.get('PATH_INFO', u'/'))
。這基本上是Django的正確行爲,但正如我的問題所述,我們只是想向用戶展示一些比空的錯誤頁面更有用的東西。因此,我們在將有效的UNICODE字符傳遞給我們的WSGIHandler之前,檢查傳入的URL請求。本博客文章指出我們到正確的方向:http://codeinthehole.com/writing/django-nginx-wsgi-and-encoded-slashes/
因此,我們重新路由無效的網址,我們wsgi.py裏面,像這樣:
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 ......它適用於我們,但也許有更好的解決方案。
爲什麼不通過攔截錯誤簡單地從前端代理重定向用戶? –
您如何通過使用不需要編碼的乾淨URL來解決問題? –
我不明白關於代理的想法。你能解釋一下嗎? ... Pixbay有20種語言可供選擇,並且(例如)中文和日文全部字符需要適當的UR編碼。我們最終的編碼工作非常順利。無論如何,術語「乾淨」並不完全正確,因爲%-encoding確實是處理URL內國際字符的正確方式。 –