/ / UnicodeEncodeError podczas zapisywania ImageField zawierającego znaki spoza ASCII w Django admin - django, apache, unicode, django-admin

UnicodeEncodeError podczas zapisywania ImageField zawierającego znaki spoza ASCII w Django admin - django, apache, unicode, django-admin

Próbuję przesłać plik obrazu w ininiach admin django i uzyskać UnicodeEncodeError podczas próby przesłania pliku z nazwą pliku zawierającą znaki spoza zestawu 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)

W dokumentacji Django znajduje się akapit dotyczący tego problemu: http://docs.djangoproject.com/en/dev/howto/deployment/modpython/#if-you-get-a-unicodeencodeerror - mówią, że muszę zdefiniować zmienne env LANG i LC_ALL oraz zdefiniować je za pomocą os.env, które nie działają, więc zdefiniowałem je w moim pliku .htaccess i jestem pewien, że tam są:

META
Variable    Value
CONTENT_LENGTH  "27289"
...
LANG    "en_US.utf-8"
LC_ALL  "en_US.utf-8"
LC_LANG     "en_US.utf-8"

Problem nadal istnieje. Wersja Django to 1.2.3 (najnowsza stabilna), sys.getfilesystemencoding () (co moim zdaniem jest istotne dla problemu) zwróci "ANSI_X3.4-1968".

Kod modelu / administratora nie jest niczym szczególnym: model ArticleImage z ImageField i artAdmin zawierający inlines artykułuImage.

AKTUALIZACJA Nie mogłem rozwiązać tego problemu, więc zrezygnowałem z używaniaapache setup i uruchomił aplikację przy użyciu runfcgi + nginx. Przesyłanie działa teraz dobrze, ale nie dodaję tego jako rozwiązania, ponieważ pytanie dotyczyło Apache.

Odpowiedzi:

7 dla odpowiedzi № 1

Na Debianie (Lenny) wystarczy dodać następujące dwa wiersze do /etc/apache2/envvars:

export LANG="en_GB.utf-8"
export LC_ALL="en_GB.utf-8"

... to jest dla brytyjskich serwerów internetowych.

export LANG="en_US.utf-8"
export LC_ALL="en_US.utf-8"

I ponownie uruchom Apache.


6 dla odpowiedzi nr 2

Powinieneś spróbować zdefiniować LANG i LC_ALL dla całego środowiska Apache 2.

W przypadku moich wdrożeń upewniam się także, że domyślne kodowanie systemowe Pythona jest również ustawione na UTF-8.

Dla domyślnego kodowania Pythona zwykle tworzę / edytuję sitecustomize.py, zobacz http://blog.ianbicking.org/illusive-setdefaultencoding.html

Jeśli chodzi o Apache - istnieje linia w skrypcie init/etc/init.d/apache2 (Ubuntu 8.04 LTS), który tworzy środowisko. Dodałem tam prawidłową LC_ALL, LANG. Zasadniczo powinien znajdować się w skryptach startowych serwera dla wszystkich systemów operacyjnych.


0 dla odpowiedzi № 3

twoje może to zrobić.

w linuxie:

echo $LANG   i got zh_CN.utf-8

w 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 ten dokument też mi pomaga.

Myślę, że to problem z os i apache!