我遇到了使用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”
答案 0 :(得分:2)
使用Django REST Framework 3.1.1我没有遇到这个问题。它在可浏览的API中显示“GradosCentígrados”没有问题。您是否在设置中修改了REST_FRAMEWORK设置?如果是这样,你能发帖吗?
假设您使用的是Django Rest Framework 2,除非您使用的UnicodeJSONRenderer与JSONRenderer不同,否则您可能会遇到此问题。在3.0+中,UnicodeJSONRenderer
现在称为JSONRenderer
,因此始终默认显示 未转义 utf-8编码中的字符串。
使用utf-8编码将请求数据呈现为JSON。
请注意,将使用JSON的\ uXXXX字符转义呈现非ascii字符。例如:
{"unicode black star": "\u2605"}
使用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',
)
}