django rest-framework api和unicode字符

时间:2014-10-10 12:11:36

标签: json django rest unicode

我正在使用django-rest-framework为我的应用程序创建一个api。我的应用程序使用希腊字母作为其模型的值。我创建了我的视图集并使用UnicodeJSONRenderer返回json结果。

class ChapterViewSet(viewsets.ModelViewSet):
    queryset = Chapter.objects.all()
    serializer_class = ChapterSerializer
    renderer_classes = (UnicodeJSONRenderer, )

Json被退回但浏览器无法识别希腊字母(“ΞΟΟΟΞΈΞΟΞ·)。在chrome的开发控制台上,虽然在网络选项卡上,响应的预览正常显示希腊字母。如何让我的浏览器识别希腊字母?

3 个答案:

答案 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。

希望它也适合你!