Django utf-8 网址

Django utf-8 urls

我有一个 Django 应用程序在 localhost.even for utf-8 URL path.but 上工作正常,当我在生产中使用它时它给我一个错误:

2019-09-01 14:32:09.558237 [ERROR] [12257] wsgiAppHandler pApp->start_response() return NULL.
Traceback (most recent call last):
File "/home/medualla/virtualenv/project/3.7/lib/python3.7/site-packages/django/core/handlers/wsgi.py", line 139, in call 
set_script_prefix(get_script_name(environ))
File "/home/medualla/virtualenv/project/3.7/lib/python3.7/site-packages/django/core/handlers/wsgi.py", line 179, in get_script_name
script_url = get_bytes_from_wsgi(environ, 'SCRIPT_URL', '') or get_bytes_from_wsgi(environ, 'REDIRECT_URL', '')
File "/home/medualla/virtualenv/project/3.7/lib/python3.7/site-packages/django/core/handlers/wsgi.py", line 204, in get_bytes_from_wsgi
return value.encode('iso-8859-1')
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 1-6: ordinal not in range(256)

当我尝试 url like
时出现此错误 http://meduallameh.ir/صفحه
我得到的唯一答案是网络服务器的问题。我将它部署在共享主机上,我问他们,他们告诉我 Web 服务器支持 utf-8。现在我需要一些帮助来解决这个问题。

处理一些代码并搜索问题后,我发现问题是 SCRIPT_URL 和其他内容在主机中默认解码为 utf-8。所以它给出了一个错误。我通过将 get_bytes_from_wsgi return 语句更改为此临时修复它;

def get_bytes_from_wsgi(environ, key, default):
    """
    Get a value from the WSGI environ dictionary as bytes.

    key and default should be strings.
    """
    value = environ.get(key, default)
    # Non-ASCII values in the WSGI environ are arbitrarily decoded with
    # ISO-8859-1. This is wrong for Django websites where UTF-8 is the default.
    # Re-encode to recover the original bytestring.
    return value.encode('utf-8')

所以问题解决了(暂时)。我发现很多 headers 都会发生这种情况,尤其是文件。如果有人找到其他可以修复的方法,请写在这里

有一次,我在 URL 中有 UTF-8 字符为我工作,不知何故,我注意到当我从 Python 2 迁移到 Python 时它坏了3(一路上,我也从 Apache + mod_wsgi 切换到 Apache 代理到 Gunicorn)。

根据 OP 提供的答案,我不情愿地求助于子类化默认的 WSGIHandler 和 WSGIRequest。

要点:https://gist.github.com/jontsai/afd5f5d9399ac2b0d770a73983d61690#file-django_wsgi_utf8_handler-py-L66-L69

虽然不理想,但此解决方案可以部署到多个 servers/environments。

我将尝试为 Django 项目提交补丁。