我正在使用django-rest-framework为我的应用程序创建一个api。我的应用程序使用希腊字母作为其模型的值。我创建了我的视图集并使用UnicodeJSONRenderer返回json结果。
class ChapterViewSet(viewsets.ModelViewSet):
queryset = Chapter.objects.all()
serializer_class = ChapterSerializer
renderer_classes = (UnicodeJSONRenderer, )
Json被退回但浏览器无法识别希腊字母(“ΞΟΟΟΞΈΞΟΞ·)。在chrome的开发控制台上,虽然在网络选项卡上,响应的预览正常显示希腊字母。如何让我的浏览器识别希腊字母?
答案 0 :(得分:4)
这是一个浏览器问题。
用于JSON内容的UTF-8 is the default encoding; Django Rest Framework正在将您的JSON正确编码为UTF-8,但您的浏览器没有正确显示它。
如果在Content-Type HTTP标头中提供charset=utf-8
,浏览器会正确显示它。但是,规范定义了another way of determining the encoding,所以不应该使用它。 Django Rest Framework通过不包括它来表达对此的尊重。
Chrome上有open ticket,但遗憾的是没有人关心。其他浏览器似乎也有同样的问题。另请参阅this SO question。
答案 1 :(得分:2)
这也是我遇到的一个非常奇怪的问题;我的第一印象是Django REST框架应该在Content-Type
标题中将字符集设置为UTF-8,但这已经被归档为issue #2891并且显然存在很多争论。
我最终使用的修补程序只是将UNICODE_JSON
设置为False
。这会产生更大的响应,特别是如果您的响应中有大量的unicode字符,例如水平省略号在字符串中变为\u2026
而不是等效的3字节UTF-8表示,但它不太可能被客户误解。
答案 2 :(得分:0)
为我设定了什么(因为pt-BR我需要重音)
转到您的settings.py并添加
REST_FRAMEWORK = {
#this bit makes the magic.
'DEFAULT_RENDERER_CLASSES': (
#UnicodeJSONRenderer has an ensure_ascii = False attribute,
#thus it will not escape characters.
'rest_framework.renderers.UnicodeJSONRenderer',
#You only need to keep this one if you're using the browsable API
'rest_framework.renderers.BrowsableAPIRenderer',
)
}
通过这样做,您不需要在每个视图上都包含序列化器renderer_classes。
希望它也适合你!