xf3 variable template imprimir codigo codificacion caracteres acentos django file-upload django-admin nginx django-uploads

django - variable - UnicodeEncodeError: el códec ''ascii'' no puede codificar el carácter



imprimir codigo ascii en python (12)

Al subir archivos con caracteres que no son ASCII, obtengo UnicodeEncodeError:

Exception Type: UnicodeEncodeError at /admin/studio/newsitem/add/ Exception Value: ''ascii'' codec can''t encode character u''/xf8'' in position 78: ordinal not in range(128)

Ver el seguimiento completo de la pila .

Ejecuto Django 1.2 con MySQL y nginx y FastCGI.

Este es un problema que se soluciona de acuerdo con la base de datos de Django Trac , pero todavía tengo el problema. Cualquier sugerencia sobre cómo solucionarlo es bienvenida.

EDITAR: Este es mi campo de imagen:

image = models.ImageField(_(''image''), upload_to=''uploads/images'', max_length=100)


Como se dijo antes, está relacionado con la configuración regional. Por ejemplo, si usa gunicorn para servir su django application , puede tener una init.d comandos init.d (o, como yo, una secuencia de comandos de runit), donde puede establecer la configuración regional.

Para resolver UnicodeEncodeError con la carga de archivos, coloque algo así como export LC_ALL=en_US.UTF8 en su script que ejecuta su aplicación.

Por ejemplo, esto es mío (usando gunicorn y runit ):

#!/bin/bash export LC_ALL=en_US.UTF8 cd /path/to/app/projectname exec gunicorn_django -b localhost:8000 --workers=2

Además, puede verificar su configuración regional en su plantilla, usando esto en su vista:

import locale data_to_tpl = {''loc'': locale.getlocale(), ''lod_def'': locale.getdefaultlocale()}

Y solo disply {{loc}} - {{loc_def}} en su plantilla.

¡Tendrás más información sobre tu configuración regional! Eso fue muy útil para mí.


Después de investigar esto un poco más descubrí que no había configurado el juego de caracteres en mi archivo de configuración principal de Nginx:

http { charset utf-8; }

Al agregar lo anterior, el problema desapareció y creo que esta es la forma correcta de manejar este problema.


En situaciones en las que debe mostrar una cadena Unicode en un lugar que solo acepta Ascii (como la consola o como una ruta de acceso) debe decirle a Python que desea que reemplace el mejor esfuerzo de los caracteres no ASCI.

>> problem_str = u''This is not all ascii/xf8 man'' >> safe_str = problem_str.encode(''ascii'', ''ignore'') >> safe_str ''This is not all ascii man''

Los problemas de codificación se evitan en el administrador mediante la administración prudente de plantillas de Django, pero si alguna vez ha agregado columnas personalizadas y olvidó convertir los valores a ascii, o si anula el método str para un modelo y olvida hacer esto, obtendrá el mismo error, evitando la representación de la plantilla.

Si esta cadena se guardara en su (afortunadamente utf8) base de datos no habría problema, parece que está tratando de cargar un archivo que usa el título de una entidad que tiene un carácter no ascii.


Es difícil de decir sin ver un poco más de código, pero parece estar relacionado con esta pregunta: UnicodeDecodeError al intentar guardar el archivo a través de django predeterminado basado en archivos back-end .

Al mirar el boleto de Django mencionado, parece que debería seguir algo similar a los documentos de implementación en "Si obtiene un UnicodeEncodeError":
https://docs.djangoproject.com/en/1.4/howto/deployment/modpython/#if-you-get-a-unicodeencodeerror

(Sé que esto es para Apache / mod_python pero supongo que es el mismo problema raíz de la codificación del sistema de archivos que no es UTF-8 y hay una solución similar cuando se usa nginx)

EDITAR: por lo que puedo decir, este módulo nginx sería la solución equivalente: http://wiki.nginx.org/NginxHttpCharsetModule


Espero que esto ayude. En mi caso, estoy ejecutando django a través de daemontools.

Ajuste

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

en el script de ejecución antes de ejecutar manage.py resolvió el problema con las cargas de nombre de archivo


Ninguna de las respuestas funcionó para mí (usando Apache en Ubuntu con Django 1.10); Elegí eliminar los acentos del nombre de archivo (normalizar) de la siguiente manera:

def remove_accents(value): nkfd_form = unicodedata.normalize(''NFKD'', str(value)) return "".join([c for c in nkfd_form if not unicodedata.combining(c)]) uploaded_file = self.cleaned_data[''data''] # We need to remove accents to get rid of "UnicodeEncodeError: ''ascii'' codec can''t encode character" on Ubuntu uploaded_file.name = remove_accents(uploaded_file.name)


Otra opción útil que evita reescribir el código es cambiar la codificación predeterminada para python.

Si está utilizando virtualenv puede cambiar (o crear si no existe) env/lib/python2.7/sitecustomize.py y agregar:

import sys sys.setdefaultencoding(''utf-8'')

o, si está en un sistema de producción, puede hacer lo mismo con /usr/lib/python2.7/sitecustomize.py


Para cualquier persona que encuentre este problema al ejecutar Django con Supervisor , la solución es agregar, por ejemplo, lo siguiente a la sección de supervisión de la configuración del Supervisor:

environment=LANG="en_US.utf8", LC_ALL="en_US.UTF-8", LC_LANG="en_US.UTF-8"

Esto me solucionó el problema en el Supervisor 3.0a8 que se ejecuta en Debian Squeeze.



Solo aprovechando las respuestas de este hilo y otros ...

Tuve el mismo problema con genericpath.py dando un UnicodeEncodeError al intentar cargar un nombre de archivo con caracteres que no sean ASCII.

Estaba usando nginx, uwsgi y django con python 2.7.

Todo funcionaba bien localmente pero no en el servidor

Estos son los pasos que tomé: 1. agregado a /etc/nginx/nginx.conf (no solucionó el problema)

http { charset utf-8; }

  1. Agregué esta línea a etc / default / locale (no solucionó el problema)

    LANGUAGE="en_US.UTF-8"

  2. Seguí las instrucciones que figuran debajo del encabezado ''Success'' https://code.djangoproject.com/wiki/ExpectedTestFailures (no solucionó el problema)

    aptitude install language-pack-en-base

  3. Se encuentra en este ticket https://code.djangoproject.com/ticket/17816 que sugería probar una vista en el servidor de lo que estaba sucediendo con la información de la configuración regional

En tu vista

import locale locales = "Current locale: %s %s -- Default locale: %s %s" % (locale.getlocale() + locale.getdefaultlocale())

En tu plantilla

{{ locales }}

Para mí, el problema era que no tenía locale ni locale predeterminada en mi servidor Ubuntu (aunque sí los tenía en mi máquina de desarrollo OSX local), entonces los archivos con rutas / nombres de archivo no ASCII no se cargan correctamente con python generando un UnicodeEncodeError , pero solo en el servidor de producción.

Solución

Agregué esto a mi sitio y a mi sitio admin uwsgi config files eg archivo / etc / uwsgi-emperor / vasallos / my-site-config-ini

env = LANG=en_US.utf8


Usando Python 2.7.8 y Django 1.7, resolví mi problema importando:

from __future__ import unicode_literals

y usando force_text() :

from django.utils.encoding import force_text


la respuesta de akaihola fue útil. Para aquellos que ejecutan la aplicación django con uWSGI administrado a través de un script upstart, simplemente agregue estas líneas a su /etc/init/yourapp.conf

env LANG="en_US.utf8" env LC_ALL="en_US.UTF-8" env LC_LANG="en_US.UTF-8"

Me solucionó el problema.