Kaydet (Commit) fd4ccd04 authored tarafından Duncan Parkes's avatar Duncan Parkes Kaydeden (comit) Tim Graham

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).
üst d68987ae
...@@ -49,7 +49,12 @@ class HttpRequest(object): ...@@ -49,7 +49,12 @@ class HttpRequest(object):
# Any variable assignment made here should also happen in # Any variable assignment made here should also happen in
# `WSGIRequest.__init__()`. # `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 = ''
self.path_info = '' self.path_info = ''
self.method = None self.method = None
......
...@@ -220,6 +220,12 @@ Requests and Responses ...@@ -220,6 +220,12 @@ Requests and Responses
instantiated with ``QueryDict()`` instead of ``QueryDict(None)`` or instantiated with ``QueryDict()`` instead of ``QueryDict(None)`` or
``QueryDict('')``. ``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 Tests
^^^^^ ^^^^^
......
...@@ -27,6 +27,13 @@ class RequestsTests(SimpleTestCase): ...@@ -27,6 +27,13 @@ class RequestsTests(SimpleTestCase):
self.assertEqual(list(request.COOKIES.keys()), []) self.assertEqual(list(request.COOKIES.keys()), [])
self.assertEqual(list(request.META.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): def test_httprequest_repr(self):
request = HttpRequest() request = HttpRequest()
request.path = '/somepath/' request.path = '/somepath/'
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment