在Django中创建UTF-8 JsonResponse

int*_*_ua 8 django json utf-8

是否有任何简单的方法来覆盖DjangoJSONEncoder.ensure_ascii并将其设置为Falsedjango.http.JsonResponse以任何其他方式输出非ascii文本?

Mar*_*ers 15

从 Django 1.9 开始,您可以通过传入参数值来配置JSONResponse禁用ensure_ascii开关:json_dumps_params

return JsonResponse(response_data, safe=False, json_dumps_params={'ensure_ascii': False})
Run Code Online (Sandbox Code Playgroud)

使用ensure_ascii=False,json.dumps()输出非 ASCII 代码点的 UTF-8 数据。

JsonResponse除非设置不同,否则您可以子类化以使其成为默认值:

from django.http.response import JsonResponse

class UTF8JsonResponse(JsonResponse):
    def __init__(self, *args, json_dumps_params=None, **kwargs):
        json_dumps_params = {"ensure_ascii": False, **(json_dumps_params or {})}
        super().__init__(*args, json_dumps_params=json_dumps_params, **kwargs)
Run Code Online (Sandbox Code Playgroud)

然后在整个过程中使用它而不是 JsonResponse。

在极端情况下,您可以对类进行猴子修补ensure_asciiFalse默认设置为;将以下内容放入 Django 应用程序的合适模块中(例如,在名为 的文件中patches.py):

import logging
from functools import wraps
from django.http.response import JsonResponse

logger = logging.getLogger(__name__)

def patch_jsonresponse_disable_ensure_ascii():
    if getattr(JsonResponse, '_utf8_patched', False):
        # Already patched. Add warning in logs with stack to see what location
        # is trying to patch this a second time.
        logger.warning("JSONResponse UTF8 patch already applied", stack_info=True)
        return

    logger.debug("Patching JSONResponse to disable ensure_ascii")
    orig_init = JsonResponse.__init__

    @wraps(orig_init)
    def utf8_init(self, *args, json_dumps_params=None, **kwargs):
        json_dumps_params = {"ensure_ascii": False, **(json_dumps_params or {})}
        orig_init(self, *args, json_dumps_params=json_dumps_params, **kwargs)

    JsonResponse.__init__ = utf8_init
    JsonResponse._utf8_patched = True  # to prevent accidental re-patching
Run Code Online (Sandbox Code Playgroud)

然后导入patch_jsonresponse_disable_ensure_ascii您的 Django 设置文件并根据您所需的配置调用它:

from yourapp.patches import patch_jsonresponse_disable_ensure_ascii

JSON_RESPONSES_UTF8 = True

if JSON_RESPONSES_UTF8:
    patch_jsonresponse_disable_ensure_ascii()
Run Code Online (Sandbox Code Playgroud)

  • 是否有任何设置项可以将其设置为 False ,而不是将其放在每个 JsonResponse 中? (2认同)

小智 7

编辑:

或者如果您倾向于使用utf-8格式,请使用Django的JsonResponse()代替:

safe=False

要么

return HttpResponse(json.dumps(response_data, ensure_ascii=False),
         content_type="application/json")
Run Code Online (Sandbox Code Playgroud)

更多关于safe=False HERE


旧:

你没有任何改变.

虽然Django以ASCII(UTF-8)创建JSON数据,但Javascript会自动将其解码回UTF-8.