Django REST Framework Serializer和JSONRenderer编码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django REST Framework Serializer和JSONRenderer编码相关的知识,希望对你有一定的参考价值。

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

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

"Grados Centígrados"

序列化后,serialized.data是:

 u'Grados Centxedgrados'

所以序列化器正在做

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

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

'Grados Centxc3xadgrados'

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

编辑:我正在使用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”

答案

使用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',
    ),
}
另一答案

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

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

REST_FRAMEWORK = { 'UNICODE_JSON': False }

另一答案

编写自己的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',
    )
}

以上是关于Django REST Framework Serializer和JSONRenderer编码的主要内容,如果未能解决你的问题,请参考以下文章

在 Django REST Framework 的 CreateAPIView 中的 create() 之后返回不同的序列化程序

Django-rest-framework 和 django-rest-framework-jwt APIViews and validation Authorization headers

Django Rest Framework 和 django Rest Framework simplejwt 两因素身份验证

怎么安装django rest framework

django rest framework中文介绍

17-Django-Django REST framework-REST framework及RESTful简介