diff --git a/AUTHORS b/AUTHORS index 6e79befd31..c43823ce33 100644 --- a/AUTHORS +++ b/AUTHORS @@ -306,6 +306,7 @@ answer newbie questions, and generally made Django that much better: Garth Kidd kilian Sune Kirkeby + Hiroki Kiyohara Bastian Kleineidam Cameron Knight (ckknight) Nena Kojadin diff --git a/django/contrib/auth/tests/decorators.py b/django/contrib/auth/tests/decorators.py index be99e7abb6..5aff375498 100644 --- a/django/contrib/auth/tests/decorators.py +++ b/django/contrib/auth/tests/decorators.py @@ -34,7 +34,7 @@ class LoginRequiredTestCase(AuthViewsTestCase): """ 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) diff --git a/django/contrib/auth/tests/views.py b/django/contrib/auth/tests/views.py index 6040a2f5b5..6c508cf607 100644 --- a/django/contrib/auth/tests/views.py +++ b/django/contrib/auth/tests/views.py @@ -46,7 +46,7 @@ class AuthViewsTestCase(TestCase): '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 @@ class ChangePasswordTest(AuthViewsTestCase): '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 @@ class ChangePasswordTest(AuthViewsTestCase): '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 @@ class LoginTest(AuthViewsTestCase): '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 @@ class LoginTest(AuthViewsTestCase): '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 @@ class LoginURLSettings(AuthViewsTestCase): 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 @@ class LogoutTest(AuthViewsTestCase): 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,7 +457,7 @@ class LogoutTest(AuthViewsTestCase): 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): @@ -465,7 +465,7 @@ class LogoutTest(AuthViewsTestCase): 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): @@ -473,7 +473,7 @@ class LogoutTest(AuthViewsTestCase): 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 @@ class LogoutTest(AuthViewsTestCase): 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 @@ class LogoutTest(AuthViewsTestCase): 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() diff --git a/django/contrib/formtools/tests/wizard/namedwizardtests/tests.py b/django/contrib/formtools/tests/wizard/namedwizardtests/tests.py index 7529d89a2c..214f19a04d 100644 --- a/django/contrib/formtools/tests/wizard/namedwizardtests/tests.py +++ b/django/contrib/formtools/tests/wizard/namedwizardtests/tests.py @@ -21,7 +21,7 @@ class NamedWizardTests(object): 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 @@ class NamedWizardTests(object): 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 @@ class NamedWizardTests(object): 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 @@ class NamedWizardTests(object): 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 @@ class NamedWizardTests(object): 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 @@ class NamedWizardTests(object): 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 @@ class NamedWizardTests(object): 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 @@ class NamedWizardTests(object): 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 @@ class NamedWizardTests(object): 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 @@ class NamedWizardTests(object): 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 @@ class NamedWizardTests(object): 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 @@ class NamedWizardTests(object): 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 @@ class NamedWizardTests(object): 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 @@ class NamedWizardTests(object): 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,7 +263,7 @@ class NamedWizardTests(object): 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') @@ -271,7 +271,7 @@ class NamedWizardTests(object): '%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') diff --git a/django/http/response.py b/django/http/response.py index 48a401adcb..88ac8848c2 100644 --- a/django/http/response.py +++ b/django/http/response.py @@ -392,6 +392,8 @@ class HttpResponseRedirectBase(HttpResponse): 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 diff --git a/django/test/client.py b/django/test/client.py index bb0f25e108..2506437023 100644 --- a/django/test/client.py +++ b/django/test/client.py @@ -580,7 +580,7 @@ class Client(RequestFactory): 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)) diff --git a/django/test/testcases.py b/django/test/testcases.py index f7c34a9f25..f9d028bb72 100644 --- a/django/test/testcases.py +++ b/django/test/testcases.py @@ -601,7 +601,7 @@ class TransactionTestCase(SimpleTestCase): " 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)) diff --git a/docs/ref/request-response.txt b/docs/ref/request-response.txt index 717995aea2..30f5e87100 100644 --- a/docs/ref/request-response.txt +++ b/docs/ref/request-response.txt @@ -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 diff --git a/docs/releases/1.6.txt b/docs/releases/1.6.txt index 5d615177f4..60537aca53 100644 --- a/docs/releases/1.6.txt +++ b/docs/releases/1.6.txt @@ -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 ===================================== diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py index 1633fba6b5..e0cd7cdfa1 100644 --- a/tests/regressiontests/admin_views/tests.py +++ b/tests/regressiontests/admin_views/tests.py @@ -1641,7 +1641,7 @@ class SecureViewTests(TestCase): 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',)) diff --git a/tests/regressiontests/generic_views/base.py b/tests/regressiontests/generic_views/base.py index fd2abb0aa7..7f6f261cb5 100644 --- a/tests/regressiontests/generic_views/base.py +++ b/tests/regressiontests/generic_views/base.py @@ -329,66 +329,66 @@ class RedirectViewTest(unittest.TestCase): "Default is a permanent redirect" response = RedirectView.as_view(url='/bar/')(self.rf.get('/foo/')) self.assertEqual(response.status_code, 301) - self.assertEqual(response['Location'], '/bar/') + self.assertEqual(response.url, '/bar/') def test_temporary_redirect(self): "Permanent redirects are an option" response = RedirectView.as_view(url='/bar/', permanent=False)(self.rf.get('/foo/')) self.assertEqual(response.status_code, 302) - self.assertEqual(response['Location'], '/bar/') + self.assertEqual(response.url, '/bar/') def test_include_args(self): "GET arguments can be included in the redirected URL" response = RedirectView.as_view(url='/bar/')(self.rf.get('/foo/')) self.assertEqual(response.status_code, 301) - self.assertEqual(response['Location'], '/bar/') + self.assertEqual(response.url, '/bar/') response = RedirectView.as_view(url='/bar/', query_string=True)(self.rf.get('/foo/?pork=spam')) self.assertEqual(response.status_code, 301) - self.assertEqual(response['Location'], '/bar/?pork=spam') + self.assertEqual(response.url, '/bar/?pork=spam') def test_include_urlencoded_args(self): "GET arguments can be URL-encoded when included in the redirected URL" response = RedirectView.as_view(url='/bar/', query_string=True)( self.rf.get('/foo/?unicode=%E2%9C%93')) self.assertEqual(response.status_code, 301) - self.assertEqual(response['Location'], '/bar/?unicode=%E2%9C%93') + self.assertEqual(response.url, '/bar/?unicode=%E2%9C%93') def test_parameter_substitution(self): "Redirection URLs can be parameterized" response = RedirectView.as_view(url='/bar/%(object_id)d/')(self.rf.get('/foo/42/'), object_id=42) self.assertEqual(response.status_code, 301) - self.assertEqual(response['Location'], '/bar/42/') + self.assertEqual(response.url, '/bar/42/') def test_redirect_POST(self): "Default is a permanent redirect" response = RedirectView.as_view(url='/bar/')(self.rf.post('/foo/')) self.assertEqual(response.status_code, 301) - self.assertEqual(response['Location'], '/bar/') + self.assertEqual(response.url, '/bar/') def test_redirect_HEAD(self): "Default is a permanent redirect" response = RedirectView.as_view(url='/bar/')(self.rf.head('/foo/')) self.assertEqual(response.status_code, 301) - self.assertEqual(response['Location'], '/bar/') + self.assertEqual(response.url, '/bar/') def test_redirect_OPTIONS(self): "Default is a permanent redirect" response = RedirectView.as_view(url='/bar/')(self.rf.options('/foo/')) self.assertEqual(response.status_code, 301) - self.assertEqual(response['Location'], '/bar/') + self.assertEqual(response.url, '/bar/') def test_redirect_PUT(self): "Default is a permanent redirect" response = RedirectView.as_view(url='/bar/')(self.rf.put('/foo/')) self.assertEqual(response.status_code, 301) - self.assertEqual(response['Location'], '/bar/') + self.assertEqual(response.url, '/bar/') def test_redirect_DELETE(self): "Default is a permanent redirect" response = RedirectView.as_view(url='/bar/')(self.rf.delete('/foo/')) self.assertEqual(response.status_code, 301) - self.assertEqual(response['Location'], '/bar/') + self.assertEqual(response.url, '/bar/') def test_redirect_when_meta_contains_no_query_string(self): "regression for #16705" diff --git a/tests/regressiontests/httpwrappers/tests.py b/tests/regressiontests/httpwrappers/tests.py index c76d8eafe3..2d3240915e 100644 --- a/tests/regressiontests/httpwrappers/tests.py +++ b/tests/regressiontests/httpwrappers/tests.py @@ -410,6 +410,8 @@ class HttpResponseSubclassesTests(TestCase): content='The resource has temporarily moved', content_type='text/html') self.assertContains(response, 'The resource has temporarily moved', status_code=302) + # Test that url attribute is right + self.assertEqual(response.url, response['Location']) def test_not_modified(self): response = HttpResponseNotModified() diff --git a/tests/regressiontests/middleware/tests.py b/tests/regressiontests/middleware/tests.py index 6c436415ab..73a6279e2c 100644 --- a/tests/regressiontests/middleware/tests.py +++ b/tests/regressiontests/middleware/tests.py @@ -69,7 +69,7 @@ class CommonMiddlewareTest(TestCase): request = self._get_request('slash') r = CommonMiddleware().process_request(request) self.assertEqual(r.status_code, 301) - self.assertEqual(r['Location'], 'http://testserver/middleware/slash/') + self.assertEqual(r.url, 'http://testserver/middleware/slash/') @override_settings(APPEND_SLASH=True, DEBUG=True) def test_append_slash_no_redirect_on_POST_in_DEBUG(self): @@ -101,7 +101,7 @@ class CommonMiddlewareTest(TestCase): r = CommonMiddleware().process_request(request) self.assertEqual(r.status_code, 301) self.assertEqual( - r['Location'], + r.url, 'http://testserver/middleware/needsquoting%23/') @override_settings(APPEND_SLASH=False, PREPEND_WWW=True) @@ -110,7 +110,7 @@ class CommonMiddlewareTest(TestCase): r = CommonMiddleware().process_request(request) self.assertEqual(r.status_code, 301) self.assertEqual( - r['Location'], + r.url, 'http://www.testserver/middleware/path/') @override_settings(APPEND_SLASH=True, PREPEND_WWW=True) @@ -118,7 +118,7 @@ class CommonMiddlewareTest(TestCase): request = self._get_request('slash/') r = CommonMiddleware().process_request(request) self.assertEqual(r.status_code, 301) - self.assertEqual(r['Location'], + self.assertEqual(r.url, 'http://www.testserver/middleware/slash/') @override_settings(APPEND_SLASH=True, PREPEND_WWW=True) @@ -126,7 +126,7 @@ class CommonMiddlewareTest(TestCase): request = self._get_request('slash') r = CommonMiddleware().process_request(request) self.assertEqual(r.status_code, 301) - self.assertEqual(r['Location'], + self.assertEqual(r.url, 'http://www.testserver/middleware/slash/') @@ -171,7 +171,7 @@ class CommonMiddlewareTest(TestCase): self.assertFalse(r is None, "CommonMiddlware failed to return APPEND_SLASH redirect using request.urlconf") self.assertEqual(r.status_code, 301) - self.assertEqual(r['Location'], 'http://testserver/middleware/customurlconf/slash/') + self.assertEqual(r.url, 'http://testserver/middleware/customurlconf/slash/') @override_settings(APPEND_SLASH=True, DEBUG=True) def test_append_slash_no_redirect_on_POST_in_DEBUG_custom_urlconf(self): @@ -208,7 +208,7 @@ class CommonMiddlewareTest(TestCase): "CommonMiddlware failed to return APPEND_SLASH redirect using request.urlconf") self.assertEqual(r.status_code, 301) self.assertEqual( - r['Location'], + r.url, 'http://testserver/middleware/customurlconf/needsquoting%23/') @override_settings(APPEND_SLASH=False, PREPEND_WWW=True) @@ -218,7 +218,7 @@ class CommonMiddlewareTest(TestCase): r = CommonMiddleware().process_request(request) self.assertEqual(r.status_code, 301) self.assertEqual( - r['Location'], + r.url, 'http://www.testserver/middleware/customurlconf/path/') @override_settings(APPEND_SLASH=True, PREPEND_WWW=True) @@ -227,7 +227,7 @@ class CommonMiddlewareTest(TestCase): request.urlconf = 'regressiontests.middleware.extra_urls' r = CommonMiddleware().process_request(request) self.assertEqual(r.status_code, 301) - self.assertEqual(r['Location'], + self.assertEqual(r.url, 'http://www.testserver/middleware/customurlconf/slash/') @override_settings(APPEND_SLASH=True, PREPEND_WWW=True) @@ -236,7 +236,7 @@ class CommonMiddlewareTest(TestCase): request.urlconf = 'regressiontests.middleware.extra_urls' r = CommonMiddleware().process_request(request) self.assertEqual(r.status_code, 301) - self.assertEqual(r['Location'], + self.assertEqual(r.url, 'http://www.testserver/middleware/customurlconf/slash/') # Legacy tests for the 404 error reporting via email (to be removed in 1.8) diff --git a/tests/regressiontests/urlpatterns_reverse/tests.py b/tests/regressiontests/urlpatterns_reverse/tests.py index eb3afe8201..9777710daf 100644 --- a/tests/regressiontests/urlpatterns_reverse/tests.py +++ b/tests/regressiontests/urlpatterns_reverse/tests.py @@ -270,31 +270,31 @@ class ReverseShortcutTests(TestCase): res = redirect(FakeObj()) self.assertTrue(isinstance(res, HttpResponseRedirect)) - self.assertEqual(res['Location'], '/hi-there/') + self.assertEqual(res.url, '/hi-there/') res = redirect(FakeObj(), permanent=True) self.assertTrue(isinstance(res, HttpResponsePermanentRedirect)) - self.assertEqual(res['Location'], '/hi-there/') + self.assertEqual(res.url, '/hi-there/') def test_redirect_to_view_name(self): res = redirect('hardcoded2') - self.assertEqual(res['Location'], '/hardcoded/doc.pdf') + self.assertEqual(res.url, '/hardcoded/doc.pdf') res = redirect('places', 1) - self.assertEqual(res['Location'], '/places/1/') + self.assertEqual(res.url, '/places/1/') res = redirect('headlines', year='2008', month='02', day='17') - self.assertEqual(res['Location'], '/headlines/2008.02.17/') + self.assertEqual(res.url, '/headlines/2008.02.17/') self.assertRaises(NoReverseMatch, redirect, 'not-a-view') def test_redirect_to_url(self): res = redirect('/foo/') - self.assertEqual(res['Location'], '/foo/') + self.assertEqual(res.url, '/foo/') res = redirect('http://example.com/') - self.assertEqual(res['Location'], 'http://example.com/') + self.assertEqual(res.url, 'http://example.com/') def test_redirect_view_object(self): from .views import absolute_kwargs_view res = redirect(absolute_kwargs_view) - self.assertEqual(res['Location'], '/absolute_arg_view/') + self.assertEqual(res.url, '/absolute_arg_view/') self.assertRaises(NoReverseMatch, redirect, absolute_kwargs_view, wrong_argument=None) diff --git a/tests/regressiontests/views/tests/i18n.py b/tests/regressiontests/views/tests/i18n.py index b1dc8808a1..0a091ed1b7 100644 --- a/tests/regressiontests/views/tests/i18n.py +++ b/tests/regressiontests/views/tests/i18n.py @@ -44,7 +44,7 @@ class I18NTests(TestCase): lang_code, lang_name = settings.LANGUAGES[0] post_data = dict(language=lang_code, next='//unsafe/redirection/') response = self.client.post('/views/i18n/setlang/', data=post_data) - self.assertEqual(response['Location'], 'http://testserver/') + self.assertEqual(response.url, 'http://testserver/') self.assertEqual(self.client.session['django_language'], lang_code) def test_setlang_reversal(self):