Do not treat empty payload as empty dict

This allows views to distinguish missing payload from empty payload.

Related: #3647, #4566
This commit is contained in:
Peter Thomassen 2020-02-17 15:25:52 +01:00
parent f81ca78642
commit 203e0a0dde
3 changed files with 7 additions and 10 deletions

View File

@ -334,7 +334,7 @@ class Request:
if media_type and is_form_media_type(media_type): if media_type and is_form_media_type(media_type):
empty_data = QueryDict('', encoding=self._request._encoding) empty_data = QueryDict('', encoding=self._request._encoding)
else: else:
empty_data = {} empty_data = None
empty_files = MultiValueDict() empty_files = MultiValueDict()
return (empty_data, empty_files) return (empty_data, empty_files)

View File

@ -56,14 +56,14 @@ class TestContentParsing(TestCase):
Ensure request.data returns empty QueryDict for GET request. Ensure request.data returns empty QueryDict for GET request.
""" """
request = Request(factory.get('/')) request = Request(factory.get('/'))
assert request.data == {} assert request.data is None
def test_standard_behaviour_determines_no_content_HEAD(self): def test_standard_behaviour_determines_no_content_HEAD(self):
""" """
Ensure request.data returns empty QueryDict for HEAD request. Ensure request.data returns empty QueryDict for HEAD request.
""" """
request = Request(factory.head('/')) request = Request(factory.head('/'))
assert request.data == {} assert request.data is None
def test_request_DATA_with_form_content(self): def test_request_DATA_with_form_content(self):
""" """

View File

@ -5,7 +5,7 @@ from django.contrib.auth.models import User
from django.shortcuts import redirect from django.shortcuts import redirect
from django.test import TestCase, override_settings 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.decorators import api_view
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.test import ( from rest_framework.test import (
@ -35,13 +35,10 @@ def redirect_view(request):
return redirect('/view/') return redirect('/view/')
class BasicSerializer(serializers.Serializer):
flag = fields.BooleanField(default=lambda: True)
@api_view(['POST']) @api_view(['POST'])
def post_view(request): 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) serializer.is_valid(raise_exception=True)
return Response(serializer.validated_data) return Response(serializer.validated_data)
@ -198,7 +195,7 @@ class TestAPITestClient(TestCase):
content_type='application/json' content_type='application/json'
) )
assert response.status_code == 200 assert response.status_code == 200
assert response.data == {"flag": True} assert response.data is None
class TestAPIRequestFactory(TestCase): class TestAPIRequestFactory(TestCase):