Django之JsonResponse类

JsonResponse类:

用来对象dumpjson字符串,然后返回将json字符串封装成Response对象返回给浏览器。并且他的Content-Typeapplication/json。示例代码如下:

from django.http import JsonResponse
def index(request):
    return JsonResponse({"username":"zhiliao","age":18})

默认情况下JsonResponse只能对字典进行dump,如果想要对非字典的数据进行dump,那么需要给JsonResponse传递一个safe=False参数。示例代码如下:

from django.http import JsonResponse
def index(request):
    persons = ['张三','李四','王五']
    return JsonResponse(persons)

以上代码会报错,应该在使用HttpResponse的时候,传入一个safe=False参数,示例代码如下:

return JsonResponse(persons,safe=False, json_dumps_params={'ensure_ascii': False}
)

 JsonReponse源码分析

class JsonResponse(HttpResponse):
    """
    An HTTP response class that consumes data to be serialized to JSON.

    :param data: Data to be dumped into json. By default only ``dict`` objects
      are allowed to be passed due to a security flaw before EcmaScript 5. See
      the ``safe`` parameter for more information.
    :param encoder: Should be an json encoder class. Defaults to
      ``django.core.serializers.json.DjangoJSONEncoder``.
    :param safe: Controls if only ``dict`` objects may be serialized. Defaults
      to ``True``.
    :param json_dumps_params: A dictionary of kwargs passed to json.dumps().
    """

    def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
                 json_dumps_params=None, **kwargs):
        # safe 参数判断数据是否为字典形式,不是字典形式则抛TypeError异常     如果safe为False则利用短路操作默认为False,以下条件不执行,代表可支持dict以外形式数据
        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.'
            )
        # json.dump可以传递很多参数:  json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, 
      separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
     # json_dumps_params为字典形式, 如果json.dump需要传递参数则可以指定json_dumps_params参数
     # 例: return JsonResponse(back_dic, safe=False, json_dumps_params={'ensure_ascii': False})
if json_dumps_params is None: json_dumps_params = {}      # 设置content_type返回的数据格式为application/json kwargs.setdefault('content_type', 'application/json')
     # 将json_dumps_params打散,将data序列化 data
= json.dumps(data, cls=encoder, **json_dumps_params) super(JsonResponse, self).__init__(content=data, **kwargs)

 

posted @ 2019-06-28 20:46  yyfgrd  阅读(575)  评论(0)    收藏  举报