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。
虽然不理想,但此解决方案可以部署到多个 servers/environments。
我将尝试为 Django 项目提交补丁。
我有一个 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。
虽然不理想,但此解决方案可以部署到多个 servers/environments。
我将尝试为 Django 项目提交补丁。