/ / UnicodeEncodeError ao salvar ImageField contendo caracteres não ASCII no Django admin - django, apache, unicode, django-admin

UnicodeEncodeError ao salvar ImageField contendo caracteres não-ASCII no Django admin-django, apache, unicode, django-admin

Eu estou tentando fazer upload de um arquivo de imagem em inline admin django e obtendo UnicodeEncodeError ao tentar fazer upload de um arquivo com um nome de arquivo contendo caracteres não-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)

Há um parágrafo sobre esse problema nos documentos do Django: http://docs.djangoproject.com/en/dev/howto/deployment/modpython/#if-you-get-a-unicodeencodeerror - eles dizem que eu devo definir as variáveis ​​LANG e LC_ALL env, além de defini-las usando os.env não funciona. Então eu as defini no arquivo .htaccess e tenho certeza de que elas estão lá:

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

O problema ainda existe. A versão do Django é 1.2.3 (estável mais recente), sys.getfilesystemencoding () (que, acredito, seja relevante para o problema) retorna "ANSI_X3.4-1968".

O código do modelo / admin não é nada especial: um modelo ArticleImage com ImageField e ArticleAdmin contendo o ArticleImage inlines.

ATUALIZAR Não consegui corrigir este problema, por isso desisti de usarinstalação do apache e iniciou o aplicativo usando runfcgi + nginx. Uploads funcionam bem agora, mas eu não estou adicionando isso como uma solução, porque a questão era sobre o apache.

Respostas:

7 para resposta № 1

No Debian (Lenny) você simplesmente adiciona as duas linhas seguintes /etc/apache2/envvars:

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

... isso é para servidores da Web do Reino Unido. Para EUA:

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

E reinicie o Apache.


6 para resposta № 2

Você deve tentar definir o LANG e o LC_ALL para todo o ambiente do Apache 2.

Para minhas implantações, também me certifico de que a codificação padrão do sistema python também esteja definida como utf-8.

Para a codificação padrão do Python eu costumo criar / editar sitecustomize.py, veja http://blog.ianbicking.org/illusive-setdefaultencoding.html

Quanto ao Apache - não há linha no script de inicialização/etc/init.d/apache2 (Ubuntu 8.04 LTS) que cria o ambiente. Eu adicionei o LC_ALL correto, LANG lá. Basicamente, ele deve estar nos scripts de inicialização do servidor em algum lugar para todos os sistemas operacionais.


0 para resposta № 3

seu pode fazer assim.

no linux:

echo $LANG   i got zh_CN.utf-8

em 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 este doc também me ajuda.

Eu acho que é o problema do sistema operacional e do apache!