解決方案:JsonResponse(data, json_dumps_params={'ensure_ascii':False})
阿新 • • 發佈:2018-12-11
解決方案:JsonResponse(data, json_dumps_params={'ensure_ascii':False})
! data是需要渲染的字典
1 2 3 |
def
master(request):
data
=
{
'這是'
:
'主頁'
}
return
JsonResponse(data, json_dumps_params
=
{
'ensure_ascii'
:
False
}) |
顯示效果:
首先我們看JsonResponse()的原始碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class
JsonResponse(HttpResponse):
def
__init__(
self
, data, encoder
=
DjangoJSONEncoder, safe
=
True
,
json_dumps_params
=
None
,
*
*
kwargs):
if
safe
and
not
isinstance
(data,
dict
):
raise
TypeError(
'In order to allow non-dict objects to be serialized set the '
'safe parameter to False.'
)
if
json_dumps_params
is
None
:
json_dumps_params
=
{}
kwargs.setdefault(
'content_type'
,
'application/json'
)
data
=
json.dumps(data,
cls
=
encoder,
*
*
json_dumps_params)
super
(JsonResponse,
self
).__init__(content
=
data,
*
*
kwargs)
|
這裡我們從根源開始找它編碼錯誤的原因:
JsonResponse()在初始化的時候使用了json.dumps()把字典轉換成了json格式,具體方法如下:
1 |
data
=
json.dumps(data,
cls
=
encoder,
*
*
json_dumps_params)
|
接下來我們看看json.dumps()的原始碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
def
dumps(obj, skipkeys
=
False
, ensure_ascii
=
True
, check_circular
=
True
,
allow_nan
=
True
,
cls
=
None
, indent
=
None
, separators
=
None
,
default
=
None
, sort_keys
=
False
,
*
*
kw):
if
(
not
skipkeys
and
ensure_ascii
and
check_circular
and
allow_nan
and
cls
is
None
and
indent
is
None
and
separators
is
None
and
default
is
None
and
not
sort_keys
and
not
kw):
return
_default_encoder.encode(obj)
if
cls
is
None
:
cls
=
JSONEncoder
return
cls
(skipkeys
=
skipkeys, ensure_ascii
=
ensure_ascii,
check_circular
=
check_circular, allow_nan
=
allow_nan,
indent
=
indent,separators
=
separators, default
=
default,
sort_keys
=
sort_keys,
*
*
kw).encode(obj)
|
原始碼註釋原文:If ``ensure_ascii`` is false, then the return value can contain non-ASCII characters if they appear in strings contained in ``obj``. Otherwise, all such characters are escaped in JSON strings.
也就是說ensure_ascii是false的時候,可以返回非ASCII碼的值,否則就會被JSON轉義。
所以含有中文的字典轉json字串時,使用 json.dumps() 方法要把ensure_ascii引數改成false,即 json.dumps(dict,ensure_ascii=False)。
JsonResponse()接收引數有關鍵詞引數,json_dumps_params=None ,用來給 json.dumps() 傳參,所以 要在關鍵字引數後面拼個字典來傳另一組關鍵字引數 ensure_ascii=False,即:
json_dumps_params={'ensure_ascii':False}