From 203e0a0dde1dbf251c03b70a601d7bd0ff20b008 Mon Sep 17 00:00:00 2001 From: Peter Thomassen Date: Mon, 17 Feb 2020 15:25:52 +0100 Subject: [PATCH] Do not treat empty payload as empty dict This allows views to distinguish missing payload from empty payload. Related: #3647, #4566 --- rest_framework/request.py | 2 +- tests/test_request.py | 4 ++-- tests/test_testing.py | 11 ++++------- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/rest_framework/request.py b/rest_framework/request.py index ec4b749c2..c2a292d8d 100644 --- a/rest_framework/request.py +++ b/rest_framework/request.py @@ -334,7 +334,7 @@ class Request: if media_type and is_form_media_type(media_type): empty_data = QueryDict('', encoding=self._request._encoding) else: - empty_data = {} + empty_data = None empty_files = MultiValueDict() return (empty_data, empty_files) diff --git a/tests/test_request.py b/tests/test_request.py index 0f682deb0..640068780 100644 --- a/tests/test_request.py +++ b/tests/test_request.py @@ -56,14 +56,14 @@ class TestContentParsing(TestCase): Ensure request.data returns empty QueryDict for GET request. """ request = Request(factory.get('/')) - assert request.data == {} + assert request.data is None def test_standard_behaviour_determines_no_content_HEAD(self): """ Ensure request.data returns empty QueryDict for HEAD request. """ request = Request(factory.head('/')) - assert request.data == {} + assert request.data is None def test_request_DATA_with_form_content(self): """ diff --git a/tests/test_testing.py b/tests/test_testing.py index 8094bfd8d..c4a343d40 100644 --- a/tests/test_testing.py +++ b/tests/test_testing.py @@ -5,7 +5,7 @@ from django.contrib.auth.models import User from django.shortcuts import redirect from django.test import TestCase, override_settings -from rest_framework import fields, serializers +from rest_framework import serializers from rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework.test import ( @@ -35,13 +35,10 @@ def redirect_view(request): return redirect('/view/') -class BasicSerializer(serializers.Serializer): - flag = fields.BooleanField(default=lambda: True) - - @api_view(['POST']) def post_view(request): - serializer = BasicSerializer(data=request.data) + serializer = serializers.Serializer(data=request.data) + serializer.allow_null = True serializer.is_valid(raise_exception=True) return Response(serializer.validated_data) @@ -198,7 +195,7 @@ class TestAPITestClient(TestCase): content_type='application/json' ) assert response.status_code == 200 - assert response.data == {"flag": True} + assert response.data is None class TestAPIRequestFactory(TestCase):