2010-12-09 83 views
9

我想上传Django管理行内的图像文件,并得到UnicodeEncodeError试图上传包含非ASCII字符的文件名的文件时:UnicodeEncodeError

File "/usr/local/lib/python2.6/site-packages/django/db/models/fields/files.py", line 92, in save 
    self.name = self.storage.save(name, content) 

File "/usr/local/lib/python2.6/site-packages/django/core/files/storage.py", line 47, in save 
    name = self.get_available_name(name) 

File "/usr/local/lib/python2.6/site-packages/django/core/files/storage.py", line 73, in get_available_name 
    while self.exists(name): 

File "/usr/local/lib/python2.6/site-packages/django/core/files/storage.py", line 196, in exists 
    return os.path.exists(self.path(name)) 

File "/usr/local/lib/python2.6/genericpath.py", line 18, in exists 
    st = os.stat(path) 

在Django文档中有关于这个问题的一段:http://docs.djangoproject.com/en/dev/howto/deployment/modpython/#if-you-get-a-unicodeencodeerror - 他们说我必须定义LANG和LC_ALL env变量,再加上使用os.env定义它们是行不通的。所以我已经在我的.htaccess文件中定义了它们,我确定它们在那里:

META 
Variable Value 
CONTENT_LENGTH '27289' 
... 
LANG 'en_US.UTF-8' 
LC_ALL 'en_US.UTF-8' 
LC_LANG  'en_US.UTF-8' 

问题依然存在。 Django版本是1.2.3(最新稳定),sys.getfilesystemencoding()(我认为这与问题有关)返回“ANSI_X3.4-1968”。

模型/管理代码没什么特别:带有ImageField的ArticleImage模型和含有ArticleImage内联的ArticleAdmin。

UPDATE我无法解决这个问题,所以我放弃了使用Apache安装程序并使用runfcgi + nginx启动应用程序。上传现在可以正常工作,但我并没有将其作为解决方案添加,因为问题与apache有关。

回答

6

您应该尝试为整个Apache 2环境定义LANG和LC_ALL。

对于我的部署,我还确保python默认系统编码也设置为utf-8。

对于Python的默认编码我通常创建/编辑sitecustomize.py,看到http://blog.ianbicking.org/illusive-setdefaultencoding.html

至于阿帕奇 - 存在的init脚本/etc/init.d/apache2行(Ubuntu的8.04)创建的环境。我在那里添加了正确的LC_ALL,LANG。基本上它应该在服务器初始化脚本的所有操作系统的某处。

+0

谢谢。我该如何做到这一点,并确保它的工作?我已经编辑了添加这些变量的/ usr/sbin/envvars,并且python脚本有# - * - coding:utf-8 - * - – Andrey 2010-12-11 05:19:17

7

在Debian(伦尼)只需将以下两行添加到/etc/apache2/envvars

export LANG='en_GB.UTF-8' 
export LC_ALL='en_GB.UTF-8' 

...这是英国的网络服务器。对于美国:

export LANG='en_US.UTF-8' 
export LC_ALL='en_US.UTF-8' 

并重新启动Apache。

+0

我必须在它工作之前重新启动整个机器。 – 2012-05-28 08:30:14

+0

Apache环境变量的CentOS/Red Hat文件是`/ etc/sysconfig/httpd` – 2015-10-16 10:22:08