Permalink
Browse files

Fixed #18558 -- Added url property to HttpResponseRedirect*

Thanks coolRR for the report.
  • Loading branch information...
1 parent 3a002db commit e94f405d9499d310ef58b7409a98759a5f5512b0 @hirokiky hirokiky committed with claudep Feb 13, 2013
View
@@ -306,6 +306,7 @@ answer newbie questions, and generally made Django that much better:
Garth Kidd <http://www.deadlybloodyserious.com/>
kilian <kilian.cavalotti@lip6.fr>
Sune Kirkeby <http://ibofobi.dk/>
+ Hiroki Kiyohara <hirokiky@gmail.com>
Bastian Kleineidam <calvin@debian.org>
Cameron Knight (ckknight)
Nena Kojadin <nena@kiberpipa.org>
@@ -34,7 +34,7 @@ def testLoginRequired(self, view_url='/login_required/', login_url='/login/'):
"""
response = self.client.get(view_url)
self.assertEqual(response.status_code, 302)
- self.assertTrue(login_url in response['Location'])
+ self.assertTrue(login_url in response.url)
self.login()
response = self.client.get(view_url)
self.assertEqual(response.status_code, 200)
@@ -46,7 +46,7 @@ def login(self, password='password'):
'password': password,
})
self.assertEqual(response.status_code, 302)
- self.assertTrue(response['Location'].endswith(settings.LOGIN_REDIRECT_URL))
+ self.assertTrue(response.url.endswith(settings.LOGIN_REDIRECT_URL))
self.assertTrue(SESSION_KEY in self.client.session)
def assertContainsEscaped(self, response, text, **kwargs):
@@ -281,7 +281,7 @@ def test_password_change_succeeds(self):
'new_password2': 'password1',
})
self.assertEqual(response.status_code, 302)
- self.assertTrue(response['Location'].endswith('/password_change/done/'))
+ self.assertTrue(response.url.endswith('/password_change/done/'))
self.fail_login()
self.login(password='password1')
@@ -293,13 +293,13 @@ def test_password_change_done_succeeds(self):
'new_password2': 'password1',
})
self.assertEqual(response.status_code, 302)
- self.assertTrue(response['Location'].endswith('/password_change/done/'))
+ self.assertTrue(response.url.endswith('/password_change/done/'))
def test_password_change_done_fails(self):
with self.settings(LOGIN_URL='/login/'):
response = self.client.get('/password_change/done/')
self.assertEqual(response.status_code, 302)
- self.assertTrue(response['Location'].endswith('/login/?next=/password_change/done/'))
+ self.assertTrue(response.url.endswith('/login/?next=/password_change/done/'))
@skipIfCustomUser
@@ -336,7 +336,7 @@ def test_security_check(self, password='password'):
'password': password,
})
self.assertEqual(response.status_code, 302)
- self.assertFalse(bad_url in response['Location'],
+ self.assertFalse(bad_url in response.url,
"%s should be blocked" % bad_url)
# These URLs *should* still pass the security check
@@ -357,7 +357,7 @@ def test_security_check(self, password='password'):
'password': password,
})
self.assertEqual(response.status_code, 302)
- self.assertTrue(good_url in response['Location'],
+ self.assertTrue(good_url in response.url,
"%s should be allowed" % good_url)
@@ -376,7 +376,7 @@ def get_login_required_url(self, login_url):
settings.LOGIN_URL = login_url
response = self.client.get('/login_required/')
self.assertEqual(response.status_code, 302)
- return response['Location']
+ return response.url
def test_standard_login_url(self):
login_url = '/login/'
@@ -444,11 +444,11 @@ def test_logout_with_overridden_redirect_url(self):
self.login()
response = self.client.get('/logout/next_page/')
self.assertEqual(response.status_code, 302)
- self.assertTrue(response['Location'].endswith('/somewhere/'))
+ self.assertTrue(response.url.endswith('/somewhere/'))
response = self.client.get('/logout/next_page/?next=/login/')
self.assertEqual(response.status_code, 302)
- self.assertTrue(response['Location'].endswith('/login/'))
+ self.assertTrue(response.url.endswith('/login/'))
self.confirm_logged_out()
@@ -457,23 +457,23 @@ def test_logout_with_next_page_specified(self):
self.login()
response = self.client.get('/logout/next_page/')
self.assertEqual(response.status_code, 302)
- self.assertTrue(response['Location'].endswith('/somewhere/'))
+ self.assertTrue(response.url.endswith('/somewhere/'))
self.confirm_logged_out()
def test_logout_with_redirect_argument(self):
"Logout with query string redirects to specified resource"
self.login()
response = self.client.get('/logout/?next=/login/')
self.assertEqual(response.status_code, 302)
- self.assertTrue(response['Location'].endswith('/login/'))
+ self.assertTrue(response.url.endswith('/login/'))
self.confirm_logged_out()
def test_logout_with_custom_redirect_argument(self):
"Logout with custom query string redirects to specified resource"
self.login()
response = self.client.get('/logout/custom_query/?follow=/somewhere/')
self.assertEqual(response.status_code, 302)
- self.assertTrue(response['Location'].endswith('/somewhere/'))
+ self.assertTrue(response.url.endswith('/somewhere/'))
self.confirm_logged_out()
def test_security_check(self, password='password'):
@@ -492,7 +492,7 @@ def test_security_check(self, password='password'):
self.login()
response = self.client.get(nasty_url)
self.assertEqual(response.status_code, 302)
- self.assertFalse(bad_url in response['Location'],
+ self.assertFalse(bad_url in response.url,
"%s should be blocked" % bad_url)
self.confirm_logged_out()
@@ -512,6 +512,6 @@ def test_security_check(self, password='password'):
self.login()
response = self.client.get(safe_url)
self.assertEqual(response.status_code, 302)
- self.assertTrue(good_url in response['Location'],
+ self.assertTrue(good_url in response.url,
"%s should be allowed" % good_url)
self.confirm_logged_out()
@@ -21,7 +21,7 @@ def setUp(self):
def test_initial_call(self):
response = self.client.get(reverse('%s_start' % self.wizard_urlname))
self.assertEqual(response.status_code, 302)
- response = self.client.get(response['Location'])
+ response = self.client.get(response.url)
self.assertEqual(response.status_code, 200)
wizard = response.context['wizard']
self.assertEqual(wizard['steps'].current, 'form1')
@@ -40,7 +40,7 @@ def test_initial_call_with_params(self):
self.assertEqual(response.status_code, 302)
# Test for proper redirect GET parameters
- location = response['Location']
+ location = response.url
self.assertNotEqual(location.find('?'), -1)
querydict = QueryDict(location[location.find('?') + 1:])
self.assertEqual(dict(querydict.items()), get_params)
@@ -60,7 +60,7 @@ def test_form_post_success(self):
response = self.client.post(
reverse(self.wizard_urlname, kwargs={'step': 'form1'}),
self.wizard_step_data[0])
- response = self.client.get(response['Location'])
+ response = self.client.get(response.url)
self.assertEqual(response.status_code, 200)
wizard = response.context['wizard']
@@ -79,7 +79,7 @@ def test_form_stepback(self):
response = self.client.post(
reverse(self.wizard_urlname, kwargs={'step': 'form1'}),
self.wizard_step_data[0])
- response = self.client.get(response['Location'])
+ response = self.client.get(response.url)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context['wizard']['steps'].current, 'form2')
@@ -88,7 +88,7 @@ def test_form_stepback(self):
reverse(self.wizard_urlname, kwargs={
'step': response.context['wizard']['steps'].current
}), {'wizard_goto_step': response.context['wizard']['steps'].prev})
- response = self.client.get(response['Location'])
+ response = self.client.get(response.url)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context['wizard']['steps'].current, 'form1')
@@ -116,7 +116,7 @@ def test_form_finish(self):
reverse(self.wizard_urlname,
kwargs={'step': response.context['wizard']['steps'].current}),
self.wizard_step_data[0])
- response = self.client.get(response['Location'])
+ response = self.client.get(response.url)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context['wizard']['steps'].current, 'form2')
@@ -128,7 +128,7 @@ def test_form_finish(self):
reverse(self.wizard_urlname,
kwargs={'step': response.context['wizard']['steps'].current}),
post_data)
- response = self.client.get(response['Location'])
+ response = self.client.get(response.url)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context['wizard']['steps'].current, 'form3')
@@ -137,7 +137,7 @@ def test_form_finish(self):
reverse(self.wizard_urlname,
kwargs={'step': response.context['wizard']['steps'].current}),
self.wizard_step_data[2])
- response = self.client.get(response['Location'])
+ response = self.client.get(response.url)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context['wizard']['steps'].current, 'form4')
@@ -146,7 +146,7 @@ def test_form_finish(self):
reverse(self.wizard_urlname,
kwargs={'step': response.context['wizard']['steps'].current}),
self.wizard_step_data[3])
- response = self.client.get(response['Location'])
+ response = self.client.get(response.url)
self.assertEqual(response.status_code, 200)
all_data = response.context['form_list']
@@ -169,7 +169,7 @@ def test_cleaned_data(self):
reverse(self.wizard_urlname,
kwargs={'step': response.context['wizard']['steps'].current}),
self.wizard_step_data[0])
- response = self.client.get(response['Location'])
+ response = self.client.get(response.url)
self.assertEqual(response.status_code, 200)
post_data = self.wizard_step_data[1]
@@ -178,7 +178,7 @@ def test_cleaned_data(self):
reverse(self.wizard_urlname,
kwargs={'step': response.context['wizard']['steps'].current}),
post_data)
- response = self.client.get(response['Location'])
+ response = self.client.get(response.url)
self.assertEqual(response.status_code, 200)
step2_url = reverse(self.wizard_urlname, kwargs={'step': 'form2'})
@@ -194,14 +194,14 @@ def test_cleaned_data(self):
reverse(self.wizard_urlname,
kwargs={'step': response.context['wizard']['steps'].current}),
self.wizard_step_data[2])
- response = self.client.get(response['Location'])
+ response = self.client.get(response.url)
self.assertEqual(response.status_code, 200)
response = self.client.post(
reverse(self.wizard_urlname,
kwargs={'step': response.context['wizard']['steps'].current}),
self.wizard_step_data[3])
- response = self.client.get(response['Location'])
+ response = self.client.get(response.url)
self.assertEqual(response.status_code, 200)
all_data = response.context['all_cleaned_data']
@@ -227,7 +227,7 @@ def test_manipulated_data(self):
reverse(self.wizard_urlname,
kwargs={'step': response.context['wizard']['steps'].current}),
self.wizard_step_data[0])
- response = self.client.get(response['Location'])
+ response = self.client.get(response.url)
self.assertEqual(response.status_code, 200)
post_data = self.wizard_step_data[1]
@@ -237,14 +237,14 @@ def test_manipulated_data(self):
reverse(self.wizard_urlname,
kwargs={'step': response.context['wizard']['steps'].current}),
post_data)
- response = self.client.get(response['Location'])
+ response = self.client.get(response.url)
self.assertEqual(response.status_code, 200)
response = self.client.post(
reverse(self.wizard_urlname,
kwargs={'step': response.context['wizard']['steps'].current}),
self.wizard_step_data[2])
- loc = response['Location']
+ loc = response.url
response = self.client.get(loc)
self.assertEqual(response.status_code, 200, loc)
@@ -263,15 +263,15 @@ def test_form_reset(self):
response = self.client.post(
reverse(self.wizard_urlname, kwargs={'step': 'form1'}),
self.wizard_step_data[0])
- response = self.client.get(response['Location'])
+ response = self.client.get(response.url)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context['wizard']['steps'].current, 'form2')
response = self.client.get(
'%s?reset=1' % reverse('%s_start' % self.wizard_urlname))
self.assertEqual(response.status_code, 302)
- response = self.client.get(response['Location'])
+ response = self.client.get(response.url)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context['wizard']['steps'].current, 'form1')
@@ -392,6 +392,8 @@ def __init__(self, redirect_to, *args, **kwargs):
super(HttpResponseRedirectBase, self).__init__(*args, **kwargs)
self['Location'] = iri_to_uri(redirect_to)
+ url = property(lambda self: self['Location'])
+
class HttpResponseRedirect(HttpResponseRedirectBase):
status_code = 302
@@ -580,7 +580,7 @@ def _handle_redirects(self, response, **extra):
response.redirect_chain = []
while response.status_code in (301, 302, 303, 307):
- url = response['Location']
+ url = response.url
redirect_chain = response.redirect_chain
redirect_chain.append((url, response.status_code))
@@ -601,7 +601,7 @@ def assertRedirects(self, response, expected_url, status_code=302,
" code was %d (expected %d)" %
(response.status_code, status_code))
- url = response['Location']
+ url = response.url
scheme, netloc, path, query, fragment = urlsplit(url)
redirect_response = response.client.get(path, QueryDict(query))
@@ -746,6 +746,13 @@ types of HTTP responses. Like ``HttpResponse``, these subclasses live in
domain (e.g. ``'/search/'``). See :class:`HttpResponse` for other optional
constructor arguments. Note that this returns an HTTP status code 302.
+ .. attribute:: HttpResponseRedirect.url
+
+ .. versionadded:: 1.6
+
+ This read-only attribute represents the URL the response will redirect
+ to (equivalent to the ``Location`` response header).
+
.. class:: HttpResponsePermanentRedirect
Like :class:`HttpResponseRedirect`, but it returns a permanent redirect
@@ -68,6 +68,10 @@ Minor features
:class:`~django.views.generic.edit.DeletionMixin` is now interpolated with
its ``object``\'s ``__dict__``.
+* :class:`~django.http.HttpResponseRedirect` and
+ :class:`~django.http.HttpResponsePermanentRedirect` now provide an ``url``
+ attribute (equivalent to the URL the response will redirect to).
+
Backwards incompatible changes in 1.6
=====================================
@@ -1641,7 +1641,7 @@ def test_shortcut_view_only_available_to_staff(self):
response = self.client.get(shortcut_url, follow=False)
# Can't use self.assertRedirects() because User.get_absolute_url() is silly.
self.assertEqual(response.status_code, 302)
- self.assertEqual(response['Location'], 'http://example.com/users/super/')
+ self.assertEqual(response.url, 'http://example.com/users/super/')
@override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',))
Oops, something went wrong.

0 comments on commit e94f405

Please sign in to comment.