UnicodeEncodeError при сохранении ImageField, содержащего символы не ASCII, в админке Django - PullRequest
9 голосов
/ 09 декабря 2010

Я пытаюсь загрузить файл изображения в inline администратора django и получаю UnicodeEncodeError при попытке загрузить файл с именем файла, содержащим не-ascii символы:

 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 docs есть параграф об этой проблеме: http://docs.djangoproject.com/en/dev/howto/deployment/modpython/#if-you-get-a-unicodeencodeerror - они говорят, что я должен определить переменные env LANG и LC_ALL, плюс определение их с помощью 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».

Код модели / администратора не является чем-то особенным: модель ArticleImage с ImageField и ArticleAdmin, содержащий встроенные ArticleImage.

ОБНОВЛЕНИЕ Я не мог решить эту проблему, поэтому я перестал использовать настройку apache и запустил приложение с помощью runfcgi + nginx. Загрузка теперь работает нормально, но я не добавляю это как решение, потому что вопрос был о apache.

Ответы [ 3 ]

7 голосов
/ 08 ноября 2011

В 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.

6 голосов
/ 09 декабря 2010

Вы должны попытаться определить LANG и LC_ALL для всей среды Apache 2.

Для моих развертываний я также проверяю, чтобы системная кодировка python по умолчанию также была установлена ​​в utf-8.

Для кодировки Python по умолчанию я обычно создаю / редактирую sitecustomize.py, см. http://blog.ianbicking.org/illusive-setdefaultencoding.html

Что касается Apache - в сценарии инициализации есть строка /etc/init.d/apache2 (Ubuntu 8.04 LTS), которая создает среду. Я добавил правильный LC_ALL, LANG там. В основном это должно быть в сценариях инициализации сервера где-нибудь для всех операционных систем.

0 голосов
/ 01 декабря 2011

Вы можете сделать так.

в 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 этот документ мне тоже поможет.

Я думаю, это проблема ОС и Apache!

...