在Django admin中保存包含非ASCII字符的ImageField时出现UnicodeEncodeError

时间:2010-12-09 13:09:10

标签: django apache unicode django-admin

我正在尝试上传django admin inlines中的图像文件,并在尝试上传包含非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。

更新我无法解决此问题所以我放弃了使用apache设置并使用runfcgi + nginx启动了应用程序。上传工作正常,但我不是将其作为解决方案添加,因为问题是关于apache。

3 个答案:

答案 0 :(得分:7)

在Debian(Lenny)上,您只需将以下两行添加到/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。

答案 1 :(得分:6)

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

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

对于Python默认编码,我通常会创建/编辑sitecustomize.py,请参阅http://blog.ianbicking.org/illusive-setdefaultencoding.html

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

答案 2 :(得分:0)

你可以这样做。

在linux中

echo $LANG   i got zh_CN.UTF-8

在apache2 / envvars中

export LANG='zh_CN.UTF-8'  #keep this variable like echo $LANG.
export LC_ALL='zh_CN.UTF-8' #the same.

https://docs.djangoproject.com/en/1.4/howto/deployment/modpython/#if-you-get-a-unicodeencodeerror 这个文档对我也有帮助。

我认为这是os和apache的问题!