【问题标题】:Django REST Framework Serializer and JSONRenderer encondingDjango REST Framework 序列化器和 JSONRenderer 编码
【发布时间】:2015-05-17 14:57:15
【问题描述】:

我在使用 Django REST 框架对 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 framework 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/

我得到:“Grados CentÃgrados”

【问题讨论】:

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

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


【解决方案1】:

使用 Django REST Framework 3.1.1 我没有遇到这个问题。它在可浏览的 API 中显示“Grados Centígrados”,没有问题。您是否在设置中修改了 REST_FRAMEWORK 设置?可以的话可以发一下吗?

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

来自 2.0 文档:

JSONRenderer

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

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

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

UnicodeJSONRenderer

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

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

{"unicode black star": "★"}

因此,您可能希望在您的设置中包含以下内容:

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

【讨论】:

  • 谢谢迈克尔。我用更多信息编辑了我的第一篇文章。
【解决方案2】:

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

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

REST_FRAMEWORK = { 'UNICODE_JSON': False }

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2016-09-29
      • 2017-07-28
      • 2015-06-29
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 2019-02-19
      • 2018-06-23
      相关资源
      最近更新 更多