Создание UTF-8 JsonResponse в Django

есть ли простой способ переопределить DjangoJSONEncoder.ensure_ascii и установить его в False или выводить текст без ascii в django.http.JsonResponse любым другим способом?

4 ответов


EDIT:

или если вы склонны к формату utf-8, используйте вместо Jsonresponse () Django:

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

или

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

подробнее о safe=False здесь


старый:

вам не нужно ничего менять.

хотя Django создает данные JSON в ASCII (из UTF-8), Javascript автоматически декодирует их обратно в UTF-8.


сохранить JsonResponse for-и обратная совместимость, мы добавили / backported / реализовали его в django-compat. Возможно, это поможет кому-то сейчас или в будущем...


Я еще не нашел лучшего способа, чем использовать уже установленную платформу REST:

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


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)