2012-05-01 12 views
12

En una aplicación web (usando Frasco), me sale el siguiente error:extraño `` UnicodeEncodeError` usando os.path.exists`

Unable to retrieve the thumbnail for u'/var/data/uploads/2012/03/22/12 Gerd\xb4s Banjo Trio 1024.jpg' 
Traceback (most recent call last): 
File "/var/www/beta/env/lib/python2.7/site-packages/dblib-1.0dev3-py2.7.egg/dblib/orm/file.py", line 169, in get_thumbnail 
    if not exists(filename): 
File "/usr/lib/python2.7/genericpath.py", line 18, in exists 
    os.stat(path) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb4' in position 52: ordinal not in range(128) 

Tenga en cuenta que incluyo la repr() del nombre de archivo en el error registrado Esto muestra que el nombre del archivo se pasa como una instancia de Unicode. Tanto es correcta ...

Si funciono el culpable usando el intérprete de Python, funciona como se esperaba:

>>> from os.path import exists 
>>> exists(u'/var/data/uploads/2012/03/22/12 Gerd\xb4s Banjo Trio 1024.jpg') 
True 

Así que, obviamente, mientras se ejecuta en el entorno Frasco, Python cree que debería codificar el archivo -name utilizando el códec ASCII en lugar de UTF-8. Implementé la aplicación usando mod_wsgi detrás del Apache httpd.

Supongo que tengo que decirle a cualquiera de ellos que use UTF-8 en alguna parte? ¿Pero donde?

+0

No creo que esta es la solución correcta, pero cuando en situaciones similares Me encuentro con 'string' .encode ('utf8') hace el truco - podría valer la pena intentarlo. –

+0

Estoy seguro de que es un problema de configuración. Así que, hasta que descubrí la configuración correcta, simplemente la protegí con un bloque try/except y me acribillaba con correos electrónicos cada vez que ocurría: P Es un error y quiero que me lo recuerden :) – exhuma

Respuesta

17

Consulte los documentos de Django para el mismo problema. Al utilizar mod_wsgi, debe ser misma solución:

https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/#if-you-get-a-unicodeencodeerror

Extracto del documento vinculado anteriormente:

[...] you must ensure that the environment used to start Apache is configured to accept non-ASCII file names. If your environment is not correctly configured, you will trigger UnicodeEncodeError exceptions when calling functions like the ones in os.path on filenames that contain non-ASCII characters.

To avoid these problems, the environment used to start Apache should contain settings analogous to the following:

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

Consult the documentation for your operating system for the appropriate syntax and location to put these configuration items; /etc/apache2/envvars is a common location on Unix platforms. Once you have added these statements to your environment, restart Apache.

+4

Solo una nota: el anclaje Se está refiriendo a que ya no parece existir en esa URL. En cambio lo encontré aquí: https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/#if-you-get-a-unicodeencodeerror –

+3

En 'uwsgi.ini' no debe contener comillas : 'env = LANG = en_US.UTF-8' –

+0

En mi caso, agregué' env = LANG = en_US.UTF-8' en 'uwsgi.ini', de acuerdo con https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/uwsgi/# s-configuring-and-starting-the-uwsgi-server-for-django – shellbye

Cuestiones relacionadas