Commit d0bd5330 authored by Sambhav Satija's avatar Sambhav Satija Committed by Tim Graham
Browse files

Fixed #25254 -- Added JsonResponse json_dumps_params parameter.

parent 290145e6
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -492,12 +492,16 @@ class JsonResponse(HttpResponse):
      ``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, **kwargs):
    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)
        data = json.dumps(data, cls=encoder, **json_dumps_params)
        super(JsonResponse, self).__init__(content=data, **kwargs)
+8 −1
Original line number Diff line number Diff line
@@ -912,7 +912,7 @@ types of HTTP responses. Like ``HttpResponse``, these subclasses live in
JsonResponse objects
====================

.. class:: JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, **kwargs)
.. class:: JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs)

    An :class:`HttpResponse` subclass that helps to create a JSON-encoded
    response. It inherits most behavior from its superclass with a couple
@@ -934,6 +934,13 @@ JsonResponse objects
    ``dict`` instances are allowed). If ``safe`` is ``True`` and a non-``dict``
    object is passed as the first argument, a :exc:`TypeError` will be raised.

    The ``json_dumps_params`` parameter is a dictionary of keyword arguments
    to pass to the ``json.dumps()`` call used to generate the response.

    .. versionchanged:: 1.9

        The ``json_dumps_params`` argument was added.

Usage
-----

+4 −0
Original line number Diff line number Diff line
@@ -545,6 +545,10 @@ Requests and Responses
* Added :meth:`HttpRequest.get_port() <django.http.HttpRequest.get_port>` to
  fetch the originating port of the request.

* Added the ``json_dumps_params`` parameter to
  :class:`~django.http.JsonResponse` to allow passing keyword arguments to the
  ``json.dumps()`` call used to generate the response.

Tests
^^^^^

+4 −0
Original line number Diff line number Diff line
@@ -504,6 +504,10 @@ class JsonResponseTests(SimpleTestCase):
        response = JsonResponse({}, encoder=CustomDjangoJSONEncoder)
        self.assertEqual(json.loads(response.content.decode()), {'foo': 'bar'})

    def test_json_response_passing_arguments_to_json_dumps(self):
        response = JsonResponse({'foo': 'bar'}, json_dumps_params={'indent': 2})
        self.assertEqual(response.content.decode(), '{\n  "foo": "bar"\n}')


class StreamingHttpResponseTests(SimpleTestCase):
    def test_streaming_response(self):