2010-12-09 78 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