Fixed #22799 -- Made GET and POST on HttpRequest QueryDicts, and FILES a MultiValueDict.
Previously, GET, POST, and FILES on an HttpRequest were created in the __init__ method as dictionaries. This was not something you would usually notice causing trouble in production as you'd only see a WSGIRequest, but in testing using the test client, calling .getlist on GET, POST, or FILES for a request with no get/post data resulted in an AttributeError. Changed GET and POST on an HttpRequest object to be mutable QueryDicts (mutable because the Django tests, and probably many third party tests, were expecting it).
This commit is contained in:
parent
d68987ae25
commit
fd4ccd045c
|
@ -49,7 +49,12 @@ class HttpRequest(object):
|
|||
# Any variable assignment made here should also happen in
|
||||
# `WSGIRequest.__init__()`.
|
||||
|
||||
self.GET, self.POST, self.COOKIES, self.META, self.FILES = {}, {}, {}, {}, {}
|
||||
self.GET = QueryDict(mutable=True)
|
||||
self.POST = QueryDict(mutable=True)
|
||||
self.COOKIES = {}
|
||||
self.META = {}
|
||||
self.FILES = MultiValueDict()
|
||||
|
||||
self.path = ''
|
||||
self.path_info = ''
|
||||
self.method = None
|
||||
|
|
|
@ -220,6 +220,12 @@ Requests and Responses
|
|||
instantiated with ``QueryDict()`` instead of ``QueryDict(None)`` or
|
||||
``QueryDict('')``.
|
||||
|
||||
* The ``GET`` and ``POST`` attributes of an :class:`~django.http.HttpRequest`
|
||||
object are now :class:`~django.http.QueryDict`\s rather than dictionaries,
|
||||
and the ``FILES`` attribute is now a ``MultiValueDict``.
|
||||
This brings this class into line with the documentation and with
|
||||
``WSGIRequest``.
|
||||
|
||||
Tests
|
||||
^^^^^
|
||||
|
||||
|
|
|
@ -27,6 +27,13 @@ class RequestsTests(SimpleTestCase):
|
|||
self.assertEqual(list(request.COOKIES.keys()), [])
|
||||
self.assertEqual(list(request.META.keys()), [])
|
||||
|
||||
# .GET and .POST should be QueryDicts
|
||||
self.assertEqual(request.GET.urlencode(), '')
|
||||
self.assertEqual(request.POST.urlencode(), '')
|
||||
|
||||
# and FILES should be MultiValueDict
|
||||
self.assertEqual(request.FILES.getlist('foo'), [])
|
||||
|
||||
def test_httprequest_repr(self):
|
||||
request = HttpRequest()
|
||||
request.path = '/somepath/'
|
||||
|
|
Loading…
Reference in New Issue