/ / UnicodeEncodeError pri ukladaní súboru ImageField obsahujúceho znaky, ktoré nie sú ASCII v Django admin - django, apache, unicode, django-admin

UnicodeEncodeError pri ukladaní súboru ImageField obsahujúceho znaky, ktoré nie sú ASCII v Django admin - django, apache, unicode, django-admin

Pokúšam sa nahrať súbor obrázka v django admin inline a získať UnicodeEncodeError pri pokuse o nahranie súboru s názvom súboru obsahujúcim znaky non-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)

K dispozícii je odsek o tejto otázke v dokumente Django: http://docs.djangoproject.com/en/dev/howto/deployment/modpython/#if-you-get-a-unicodeencodeerror - hovoria, že musím definovať LANG a LC_ALL env premenné a ich definovanie pomocou os.env nebude fungovať.Takže som ich definoval v mojom súbore .htaccess a som si istý, že sú tam:

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

Problém stále existuje. Django verzia je 1.2.3 (posledná stabilná), sys.getfilesystemencoding () (čo podľa môjho názoru súvisí s problémom) vráti "ANSI_X3.4-1968".

Model / admin kód nie je nič zvláštne: ArticleImage model s ImageField, a ArticleAdmin obsahujúce ArticleImage inlines.

UPDATE Túto otázku som nedokázal vyriešiť, takže som sa jej vzdalapache nastavenie a spustenie aplikácie pomocou runfcgi + nginx. Nahrávky fungujú dobre, ale neradím to ako riešenie, pretože otázka bola o apache.

odpovede:

7 pre odpoveď č. 1

V Debiane (Lenny) jednoducho pridáte nasledujúce dva riadky /etc/apache2/envvars:

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

... to je pre britské webové servery Pre USA:

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

A reštartujte Apache.


6 pre odpoveď č. 2

Skúste definovať jazyky LANG a LC_ALL pre celé prostredie Apache 2.

Pri svojich nasadeniach sa tiež uisťujem, že kódovanie predvoleného systému Python je nastavené aj na utf-8.

Pri štandardnom kódovaní Pythonu obvykle vytvára / upravuje sitecustomize.py, pozri http://blog.ianbicking.org/illusive-setdefaultencoding.html

Pokiaľ ide o Apache - existuje init skript/etc/init.d/apache2 (Ubuntu 8.04 LTS), ktorý vytvára prostredie. Pridal som tam správny LC_ALL, LANG. V podstate by to malo byť v serverových initových skriptoch niekde pre všetky OS.


0 pre odpoveď č. 3

môže to urobiť takto.

v linux:

echo $LANG   i got zh_CN.utf-8

v 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 tento dokument mi pomáha.

Myslím, že to je os a problém apache!