/ / UnicodeEncodeError при збереженні ImageField, що містить не-ASCII символи в Django admin - django, apache, unicode, django-admin

UnicodeEncodeError при збереженні ImageField, що містить не-ASCII символи в Django admin - django, apache, unicode, django-admin

Я намагаюся завантажити файл зображення в django admin введення і отримати 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 є документи: 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".

Код моделі / адміністратора не є особливою особливістю: модель ArticleImage з ImageField, а також ArticleAdmin, що містить вбудовані статті.

UPDATE Я не зміг вирішити цю проблему, тому я відмовився від використаннявстановити apache і запустити програму за допомогою runfcgi + nginx. Завантаження відмінно працюють, але я не додаю його в якості рішення, оскільки було питання про apache.

Відповіді:

7 для відповіді № 1

На 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 для відповіді № 2

Ви повинні спробувати визначити LANG і LC_ALL для всього середовища Apache 2.

Для мого розгортання я також переконаний, що кодування системи за замовчуванням 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 там. В основному це повинно бути на сервері init скриптів десь для всіх операційних систем.


0 для відповіді № 3

ти можеш це зробити так.

в 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!