关于json:在Django中创建UTF-8 JsonResponse

Creating UTF-8 JsonResponse in Django

有没有简单的方法可以覆盖DjangoJSONEncoder.ensure_ascii并将其设置为False或以任何其他方式输出django.http.JsonResponse中的非ASCII文本?


编辑:

或者,如果您倾向于使用UTF-8格式,请使用而不是Django的jsonResponse():

1
2
return HttpResponse(json.dumps(response_data, ensure_ascii=False),
         content_type="application/json")

1
return JsonResponse(json.dumps(response_data, ensure_ascii=False), safe=False)

关于safe=False的更多信息

旧的:

你不必做任何改变。

尽管django以ASCII(来自utf-8)创建JSON数据,但javascript会自动将其解码回utf-8。


为了保持jsonResponse的向后兼容,我们在django-compat中添加了/backported/implemented。也许这对现在或将来的人有帮助…


1
2
3
4
5
6
7
8
from django.core.serializers.json import DjangoJSONEncoder
from django.http import JsonResponse


class MyJsonResponse(JsonResponse):
    def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, **kwargs):
        json_dumps_params = dict(ensure_ascii=False)
        super().__init__(data, encoder, safe, json_dumps_params, **kwargs)


我还没有找到比使用已经安装的REST框架更好的方法:

1
2
3
4
5
6
7
8
9
10
11
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from rest_framework.response import Response

from .models import INITIATOR_TYPES

@api_view(['GET'])
@permission_classes((IsAuthenticatedOrReadOnly, ))
def initiator_types(request):
    data = {t[0]: str(t[1]) for t in INITIATOR_TYPES}
    return Response(data)

但我不太喜欢。它比JsonResponse复杂得多:https://stackoverflow.com/a/24411716/854477