django休息框架反序列化德语字符不工作

时间:2014-06-24 04:19:50

标签: python django unicode django-rest-framework

我有一个像这样的JSON字符串:

u'{"repeat_password":"password","password":"password","username":"üääöp","email":"püäöö@email.com"}'

并通过以下方式运行它:

def deserialization_helper(json):
    stream = StringIO(unicode(json))
    return JSONParser().parse(stream)
#stuff...
serializer = ValidationSerializer(data=deserialization_helper(request.DATA['data']))

但是我似乎得到了以下异常,但仅限于德语字符,如果我使用普通的英文字符,它似乎工作正常。

u'JSON parse error - \\'ascii\\' codec can\\'t encode characters in position 64-67: ordinal not in range(128)'

我已将其缩小到以下一行

JSONParser().parse(stream)

但似乎无法找到一种方法让它乐意接受英语和德语。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

我遇到了同样的问题。尝试将此代码放入settings.py

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

答案 1 :(得分:2)

如果我们查看JSONParserparsers.py)的来源:

def parse(self, stream, media_type=None, parser_context=None):
    """
    Parses the incoming bytestream as JSON and returns the resulting data.
    """
    parser_context = parser_context or {}
    encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET)

    try:
        data = stream.read().decode(encoding)
        return json.loads(data)
    except ValueError as exc:
        raise ParseError('JSON parse error - %s' % six.text_type(exc))

我们看到Django-Rest-Framework需要一个 byte 流,它使用Django DEFAULT_CHARSET(大多数时候是UTF-8)进行解码。

如果不了解更多,很难提出解决方案:

  • request.DATA已由DRF解析器解析,因此当所有都是纯JSON时,没有理由重新解析。
  • 如果您使用表单编码或属性data是带有JSON内容的字符串,您可以使用force_bytes来创建字节,或直接使用json.loads(其中接受unicode)。