'ascii'编解码器无法解码位置5367中的字节0xe2:序数不在范围内(128)

时间:2014-01-13 10:27:31

标签: python xml django postgresql utf-8

  • Django 1.6.1
  • Python 3.2.3
  • Apache 2.2.2
  • Ubuntu 12.04
  • Postgres 9.1.11

尝试导入序列化的XML文件时出现此错误。我从一个用于开发服务器的数据库中导出它,稍后我将它导入另一个开发服务器上的另一个数据库(在同一台机器上)。我很困惑为什么它不会在导入时处理UTF-8字符。我没有做任何特别的事。另外,当我上次测试它时,相同的代码工作。这是我用来导出和输出的代码。导入,在应用的views.py ...

from django.shortcuts import render, render_to_response, get_object_or_404
from django.http import HttpResponseRedirect, HttpResponse
from django.contrib.auth.decorators import user_passes_test
from django.core import serializers

@user_passes_test(lambda u: u.is_superuser)
def export_serial(request):
    '''
    This exports data using Django serializing.
    See: https://docs.djangoproject.com/en/dev/topics/serialization/
    '''
    XMLSerializer = serializers.get_serializer("xml")
    xml_serializer = XMLSerializer()
    xml_serializer.serialize(list(ThisModel.objects.all()) 
                        + list(ThatModel.objects.all())
                          + list(ThirdModel.objects.all()))
    data = xml_serializer.getvalue()

    response = HttpResponse(mimetype='text/xml')
    response['Content-Disposition'] = 'attachment; filename=my-backup.xml'
    response.write(data)
    return response


@user_passes_test(lambda u: u.is_superuser)
def import_serial(request):
    '''
    This is for importing data that was saved/backed up, as serialized.
    '''
    xmlfile = '/home/zamphatta/path/to/my-backup.xml'
    serialfile = open(xmlfile,'r')
    data = serialfile.read()
    serialfile.close()

    for deserialized_object in serializers.deserialize("xml", data):
        deserialized_object.save()

    template = loader.get_template('z-style/index.htm')
    context = RequestContext(request, {
        'title': data,
    })
    return HttpResponse(template.render(context))

我用谷歌搜索&我检查了所有相关的StackOverflow问题(但答案并不能让我回答这个问题),并且仍然不知道为什么这会给我带来这个错误。我所知道的是非ascii字符正在使它变得愚蠢,这没有意义'因为Python没有UTF-8字符的问题而且我没有做任何会导致代码突然对待它的奇怪的东西

更新:以下是错误消息的更全面版本...

UnicodeDecodeError at /sdb/import/

'ascii' codec can't decode byte 0xe2 in position 5367: ordinal not in range(128)

Request Method: GET

Request URL:    http://coral/sdb/import/

Django Version: 1.6.1

Exception Type: UnicodeDecodeError

Exception Value:    
'ascii' codec can't decode byte 0xe2 in position 5367: ordinal not in range(128)

Exception Location: /usr/lib/python3.2/encodings/ascii.py in decode, line 26

Python Executable:  /usr/bin/python

Python Version: 3.2.3

Python Path:    
['/usr/local/lib/python3.2/dist-packages/distribute-0.6.49-py3.2.egg',
 '/usr/local/lib/python3.2/dist-packages/CherryPy-3.2.4-py3.2.egg',
 '/usr/lib/python3.2',
 '/usr/lib/python3.2/plat-linux2',
 '/usr/lib/python3.2/lib-dynload',
 '/usr/local/lib/python3.2/dist-packages',
 '/usr/local/lib/python3.2/dist-packages/setuptools-0.6c11-py3.2.egg-info',
 '/usr/lib/python3/dist-packages',
 '/home/dfy/code/zamphatta/',
 '/home/dfy/code/zamphatta/zamphatta/']

1 个答案:

答案 0 :(得分:0)

似乎服务器启动时python3 manage.py runserver,导入工作正常。当Django通过wsgi在Apache上运行时,当我通过Django导入它时,它无法正常工作。所以我猜测Apache在某种程度上干扰了它。它现在有效,只要我直接导入Django。