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,除非您使用的UnicodeJSONRenderer与JSONRenderer不同,否则您可能会遇到此问题。在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 两因素身份验证