Django REST Framework Serializer和JSONRenderer编码

问题描述 投票:0回答:3

我在使用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”

python json django serialization django-rest-framework
3个回答
2
投票

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

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

From the 2.0 documentation:

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
投票

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

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

REST_FRAMEWORK = { 'UNICODE_JSON': False }


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',
    )
}
© www.soinside.com 2019 - 2024. All rights reserved.