Loading django/test/client.py +7 −2 Original line number Diff line number Diff line Loading @@ -26,7 +26,7 @@ from django.utils.encoding import force_bytes, force_str, uri_to_iri from django.utils.functional import SimpleLazyObject, curry from django.utils.http import urlencode from django.utils.itercompat import is_iterable from django.utils.six.moves.urllib.parse import urlparse, urlsplit from django.utils.six.moves.urllib.parse import urljoin, urlparse, urlsplit __all__ = ('Client', 'RedirectCycleError', 'RequestFactory', 'encode_file', 'encode_multipart') Loading Loading @@ -699,7 +699,12 @@ class Client(RequestFactory): if url.port: extra['SERVER_PORT'] = str(url.port) response = self.get(url.path, QueryDict(url.query), follow=False, **extra) # Prepend the request path to handle relative path redirects path = url.path if not path.startswith('/'): path = urljoin(response.request['PATH_INFO'], path) response = self.get(path, QueryDict(url.query), follow=False, **extra) response.redirect_chain = redirect_chain if redirect_chain[-1] in redirect_chain[:-1]: Loading docs/releases/1.9.6.txt +1 −1 Original line number Diff line number Diff line Loading @@ -9,7 +9,7 @@ Django 1.9.6 fixes several bugs in 1.9.5. Bugfixes ======== * Added support for relative path redirects to * Added support for relative path redirects to the test client and to ``SimpleTestCase.assertRedirects()`` because Django 1.9 no longer converts redirects to absolute URIs (:ticket:`26428`). Loading tests/test_client/tests.py +12 −0 Original line number Diff line number Diff line Loading @@ -198,6 +198,18 @@ class ClientTest(TestCase): self.assertRedirects(response, '/get_view/', status_code=302, target_status_code=200) self.assertEqual(len(response.redirect_chain), 2) def test_follow_relative_redirect(self): "A URL with a relative redirect can be followed." response = self.client.get('/accounts/', follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(response.request['PATH_INFO'], '/accounts/login/') def test_follow_relative_redirect_no_trailing_slash(self): "A URL with a relative redirect with no trailing slash can be followed." response = self.client.get('/accounts/no_trailing_slash', follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(response.request['PATH_INFO'], '/accounts/login/') def test_redirect_http(self): "GET a URL that redirects to an http URI" response = self.client.get('/http_redirect_view/', follow=True) Loading Loading
django/test/client.py +7 −2 Original line number Diff line number Diff line Loading @@ -26,7 +26,7 @@ from django.utils.encoding import force_bytes, force_str, uri_to_iri from django.utils.functional import SimpleLazyObject, curry from django.utils.http import urlencode from django.utils.itercompat import is_iterable from django.utils.six.moves.urllib.parse import urlparse, urlsplit from django.utils.six.moves.urllib.parse import urljoin, urlparse, urlsplit __all__ = ('Client', 'RedirectCycleError', 'RequestFactory', 'encode_file', 'encode_multipart') Loading Loading @@ -699,7 +699,12 @@ class Client(RequestFactory): if url.port: extra['SERVER_PORT'] = str(url.port) response = self.get(url.path, QueryDict(url.query), follow=False, **extra) # Prepend the request path to handle relative path redirects path = url.path if not path.startswith('/'): path = urljoin(response.request['PATH_INFO'], path) response = self.get(path, QueryDict(url.query), follow=False, **extra) response.redirect_chain = redirect_chain if redirect_chain[-1] in redirect_chain[:-1]: Loading
docs/releases/1.9.6.txt +1 −1 Original line number Diff line number Diff line Loading @@ -9,7 +9,7 @@ Django 1.9.6 fixes several bugs in 1.9.5. Bugfixes ======== * Added support for relative path redirects to * Added support for relative path redirects to the test client and to ``SimpleTestCase.assertRedirects()`` because Django 1.9 no longer converts redirects to absolute URIs (:ticket:`26428`). Loading
tests/test_client/tests.py +12 −0 Original line number Diff line number Diff line Loading @@ -198,6 +198,18 @@ class ClientTest(TestCase): self.assertRedirects(response, '/get_view/', status_code=302, target_status_code=200) self.assertEqual(len(response.redirect_chain), 2) def test_follow_relative_redirect(self): "A URL with a relative redirect can be followed." response = self.client.get('/accounts/', follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(response.request['PATH_INFO'], '/accounts/login/') def test_follow_relative_redirect_no_trailing_slash(self): "A URL with a relative redirect with no trailing slash can be followed." response = self.client.get('/accounts/no_trailing_slash', follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(response.request['PATH_INFO'], '/accounts/login/') def test_redirect_http(self): "GET a URL that redirects to an http URI" response = self.client.get('/http_redirect_view/', follow=True) Loading