2010-12-09 17 views
9

Estoy intentando cargar un archivo de imagen en inlines Django admin y conseguir UnicodeEncodeError al intentar subir un archivo con un nombre de archivo que contiene caracteres no ASCII:UnicodeEncodeError al guardar ImageField contiene caracteres no ASCII en Django administrador

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) 

Hay un párrafo sobre este tema en los documentos de Django: http://docs.djangoproject.com/en/dev/howto/deployment/modpython/#if-you-get-a-unicodeencodeerror - dicen que debo definir las variables de env LANG y LC_ALL, además de definirlas con os.env no funcionará. Así que les he definido en mi archivo .htaccess y estoy seguro de que están allí: aún existe

META 
Variable Value 
CONTENT_LENGTH '27289' 
... 
LANG 'en_US.UTF-8' 
LC_ALL 'en_US.UTF-8' 
LC_LANG  'en_US.UTF-8' 

El problema. La versión de Django es 1.2.3 (última estable), sys.getfilesystemencoding() (que creo que es relevante para el problema) devuelve "ANSI_X3.4-1968".

El código de modelo/administrador no es nada especial: un modelo de ImageImage con ImageField y ArticleAdmin que contiene líneas de ArticleImage.

ACTUALIZACIÓN no podía solucionar este problema por lo que he renunciado a utilizar la configuración de Apache y comenzó la aplicación utilizando runfcgi + Nginx. Las cargas funcionan bien ahora, pero no estoy agregando esto como una solución porque la pregunta era sobre apache.

Respuesta

6

Debe intentar definir LANG y LC_ALL para todo el entorno Apache 2.

Para mis implementaciones, también me aseguro de que la codificación del sistema por defecto de python también esté configurada en utf-8.

Para la codificación por defecto de Python Por lo general crear/editar sitecustomize.py, ver http://blog.ianbicking.org/illusive-setdefaultencoding.html

En cuanto a Apache - no hay línea en /etc/init.d/apache2 script de inicio (Ubuntu 8.04 LTS) que crea el ambiente. Agregué el LC_ALL, LANG correcto allí. Básicamente debe estar en los scripts de inicio del servidor en alguna parte para todos los sistemas operativos.

+0

Gracias. ¿Cómo lo hago correctamente y me aseguro de que funcione? He editado mis/usr/sbin/envvars agregando estas variables y el script de python tiene # - * - codificación: utf-8 - * - – Andrey

7

En Debian (Lenny) sólo tiene que añadir las dos líneas siguientes a /etc/apache2/envvars:

export LANG='en_GB.UTF-8' 
export LC_ALL='en_GB.UTF-8' 

... eso es para los servidores web del Reino Unido. Para EE. UU .:

export LANG='en_US.UTF-8' 
export LC_ALL='en_US.UTF-8' 

Y reinicie Apache.

+0

Tuve que reiniciar toda la máquina antes de que funcionara. –

+0

El archivo de CentOS/Red Hat para las variables de entorno apache es '/ etc/sysconfig/httpd' –

0

puede hacer así.

en Linux:

echo $LANG i got zh_CN.UTF-8 

en 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 documento es ayudar a mí también.

¡Creo que es el problema de os y apache!

+1

Intente evitar poner comentarios (" eso funcionó para mí! ") O información de contacto en las publicaciones. –

Cuestiones relacionadas