2012-07-18 18 views
5

Veo un montón de preguntas relacionadas con esto, pero no puedo encontrar la solución.UnicodeEncodeError: el códec 'ascii' no puede codificar caracteres en la posición 1-4: ordinal no está en rango (128)

Esto está en Django 1.4 y Python 2.7.

data es un diccionario que contiene caracteres UTF8. Ver esta línea:

render_to_response('application/app.html', data, context_instance=RequestContext(request))

plantilla se dictó que da salida a los valores de que data.

¿Por qué explota y qué puedo hacer para solucionarlo?

EDIT: Después de excavar, parte de ese data contiene lxml.objectify.ObjectifiedElement. Básicamente es un elemento XML que se puede consultar como un diccionario normal. Valores que produce parecen ser adecuadas cadenas Unicode como este: u'\xae\u2020\xa5\xa8\u02c6\xf8'

Aquí está la StackTrace completo:

File "/web/mysite/env/lib/python2.7/site-packages/django/core/handlers/base.py", line 111, in get_response 
    response = callback(request, *callback_args, **callback_kwargs) 

File "/web/mysite/current/api/views.py", line 163, in invoice 
    return render_to_response('application/app.html', data, context_instance=RequestContext(request)) 

File "/web/mysite/env/lib/python2.7/site-packages/django/shortcuts/__init__.py", line 20, in render_to_response 
    return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs) 

File "/web/mysite/env/lib/python2.7/site-packages/django/template/loader.py", line 176, in render_to_string 
    return t.render(context_instance) 

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 140, in render 
    return self._render(context) 

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 134, in _render 
    return self.nodelist.render(context) 

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 823, in render 
    bit = self.render_node(node, context) 

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 837, in render_node 
    return node.render(context) 

File "/web/mysite/env/lib/python2.7/site-packages/django/template/loader_tags.py", line 123, in render 
    return compiled_parent._render(context) 

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 134, in _render 
    return self.nodelist.render(context) 

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 823, in render 
    bit = self.render_node(node, context) 

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 837, in render_node 
    return node.render(context) 

File "/web/mysite/env/lib/python2.7/site-packages/django/template/loader_tags.py", line 62, in render 
    result = block.nodelist.render(context) 

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 823, in render 
    bit = self.render_node(node, context) 

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 837, in render_node 
    return node.render(context) 

File "/web/mysite/env/lib/python2.7/site-packages/django/template/defaulttags.py", line 281, in render 
    return nodelist.render(context) 

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 823, in render 
    bit = self.render_node(node, context) 

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 837, in render_node 
    return node.render(context) 

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 880, in render 
    return _render_value_in_context(output, context) 

File "/web/mysite/env/lib/python2.7/site-packages/django/template/base.py", line 858, in _render_value_in_context 
    value = force_unicode(value) 

File "/web/mysite/env/lib/python2.7/site-packages/django/utils/encoding.py", line 74, in force_unicode 
    s = unicode(str(s), encoding, errors) 

UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-4: ordinal not in range(128) 
+0

Archivo "/web/mysite/current/api/views.py", línea 163, en la factura –

Respuesta

4

Debería no contener caracteres UTF-8; debe contener unicode s.

{'foo': u'bar'} 
+0

Gotcha. Descubrí que los datos contienen lxml.objectify.ObjectifiedDataElement y quién sabe si wtf está dentro de eso. – Grocery

+0

Ok, ese objeto lxml tiene atributos que son accesibles como un dict. Todos los valores parecen ser unicode como este: 'u '\ xae \ u2020 \ xa5 \ xa8 \ u02c6 \ xf8''. Entonces, ¿alguna pista de lo que podría estar explotando? – Grocery

+0

@Grocery puede aceptar la respuesta si le funcionó. – n611x007

0

Los valores en lxml.objectify.ObjectifiedElement no son realmente unicode. Usted puede utilizar el siguiente envoltura alrededor de su objeto ObjectifiedElement:

from lxml.objectify import ObjectifiedElement, StringElement 

class LxmlUnicodeWrapper(object): 
    """Avoids UnicodeEncodeError when using ObjectifiedElement in templates.""" 
    def __init__(self, xml): 
     self.xml = xml 

    def __getattribute__(self, name): 
     item = getattr(object.__getattribute__(self, "xml"), name) 
     if type(item) == ObjectifiedElement: 
      return LxmlUnicodeWrapper(item) 
     elif type(item) == StringElement: 
      return unicode(item) 
     else: 
      return item 

continuación

def some_view(request): 
    return render_to_response(
     "some_template.html", 
     { 
      "xml_data": LxmlUnicodeWrapper(your_xml_object) 
     }, 
    ) 
Cuestiones relacionadas