Django REST Framework Serializer和JSONRenderer enconding

时间:2015-05-17 14:57:16

标签: python json django serialization django-rest-framework

我遇到了使用Django REST Framework进行JSON格式化的序列化问题。我在我的Django项目中使用SQLite3。当我使用包含非ASCII字符的字符串序列化对象时,我会遇到问题。

例如,如果我直接查询我的模型,我会得到字符串:

"Grados Centígrados"

序列化后,serialized.data为:

 u'Grados Cent\xedgrados'

所以序列化器正在做

"Grados Centígrados".decode('UTF-8')

然后JSONRenderer再次“编码”'已解码'字符串,结果如下:

'Grados Cent\xc3\xadgrados'

我无法在浏览器中获得正确的表示。

编辑:我正在使用Django REST框架3.我在设置文件中添加了以下内容:

REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
    'rest_framework.renderers.JSONRenderer',
),
'DEFAULT_PARSER_CLASSES': (
    'rest_framework.parsers.JSONParser',
)
}

然后我按照教程中的步骤创建了urls.py和views.py:

http://www.django-rest-framework.org/tutorial/2-requests-and-responses/

我得到:“GradosCentÃgrados”

3 个答案:

答案 0 :(得分:2)

使用Django REST Framework 3.1.1我没有遇到这个问题。它在可浏览的API中显示“GradosCentígrados”没有问题。您是否在设置中修改了REST_FRAMEWORK设置?如果是这样,你能发帖吗?

假设您使用的是Django Rest Framework 2,除非您使用的UnicodeJSONRendererJSONRenderer不同,否则您可能会遇到此问题。在3.0+中,UnicodeJSONRenderer现在称为JSONRenderer,因此始终默认显示 未转义 utf-8编码中的字符串。

从2.0文档:

JSONRenderer

  

使用utf-8编码将请求数据呈现为JSON。

     

请注意,将使用JSON的\ uXXXX字符转义呈现非ascii字符。例如:

     

{"unicode black star": "\u2605"}

UnicodeJSONRenderer

  

使用utf-8编码将请求数据呈现为JSON。

     

请注意,非ascii字符不会被字符转义。例如:

     

{"unicode black star": "★"}

因此,您希望在您的设置中使用此功能:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.UnicodeJSONRenderer',
    ),
}

答案 1 :(得分:1)

UnicodeJSONRenderer班级不再存在(in version 3 of Django rest framework

默认包含它。如果要禁用它,请将以下内容粘贴到settings.py文件

REST_FRAMEWORK = { 'UNICODE_JSON': False }

答案 2 :(得分:0)

编写自己的UTF-8渲染:

  

档案:your_app/renders/__init__.py

from rest_framework.renderers import JSONRenderer

class UTF8JSONRender(JSONRenderer):
    charset = 'utf-8'

在你的settings.py中:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'your_app.renders.UTF8JSONRender',
        'rest_framework.renderers.BrowsableAPIRenderer',
    )
}