diff options
| author | Chris McDonough <chrism@plope.com> | 2013-08-20 10:13:55 -0400 |
|---|---|---|
| committer | Chris McDonough <chrism@plope.com> | 2013-08-20 10:13:55 -0400 |
| commit | d07d167f6dcdc5ef03e8aaca3c953e984a5a5f1a (patch) | |
| tree | d35c0da3c35fa8868780c8d83d7cf5a522629e0b | |
| parent | 84367e57afc0d5538e02f670834809933d9cab26 (diff) | |
| download | pyramid-d07d167f6dcdc5ef03e8aaca3c953e984a5a5f1a.tar.gz pyramid-d07d167f6dcdc5ef03e8aaca3c953e984a5a5f1a.tar.bz2 pyramid-d07d167f6dcdc5ef03e8aaca3c953e984a5a5f1a.zip | |
raise ValueError instead of generating just path when _app_url is provided to request.route_url and the route has an external pattern
| -rw-r--r-- | CHANGES.txt | 6 | ||||
| -rw-r--r-- | docs/narr/urldispatch.rst | 11 | ||||
| -rw-r--r-- | pyramid/config/routes.py | 26 | ||||
| -rw-r--r-- | pyramid/tests/test_url.py | 7 |
4 files changed, 29 insertions, 21 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index b4fe60085..1eeb0ce7b 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -142,9 +142,9 @@ Features - The ``alchemy`` scaffold tests now provide better coverage. See https://github.com/Pylons/pyramid/pull/1029 -- The ``pyramid.config.Configurator.add_route`` method now supports being called - with an external URL as pattern. See https://github.com/Pylons/pyramid/issues/611 - for more information. +- The ``pyramid.config.Configurator.add_route`` method now supports being + called with an external URL as pattern. See + https://github.com/Pylons/pyramid/issues/611 for more information. Bug Fixes --------- diff --git a/docs/narr/urldispatch.rst b/docs/narr/urldispatch.rst index f3513624e..62eb89348 100644 --- a/docs/narr/urldispatch.rst +++ b/docs/narr/urldispatch.rst @@ -785,11 +785,12 @@ purposes only and are never considered for matching at request time. >>> request.route_url('youtube', video_id='oHg5SJYRHA0') >>> "https://youtube.com/watch/oHg5SJYRHA0" -All pattern replacements and calls to -:meth:`pyramid.request.Request.route_url` will work as expected. Note that -:meth:`pyramid.request.Request.route_path` will also just return the external -URLs path part. - +Most pattern replacements and calls to +:meth:`pyramid.request.Request.route_url` will work as expected. However, calls +to :meth:`pyramid.request.Request.route_path` against external patterns will +raise an exception, and passing ``_app_url`` to +:meth:`~pyramid.request.Request.route_url` to generate a URL against a route +that has an external pattern will also raise an exception. .. index:: single: redirecting to slash-appended routes diff --git a/pyramid/config/routes.py b/pyramid/config/routes.py index af7ddd6f3..0ed370c94 100644 --- a/pyramid/config/routes.py +++ b/pyramid/config/routes.py @@ -385,21 +385,29 @@ class RoutesConfiguratorMixin(object): if pattern is None: raise ConfigurationError('"pattern" argument may not be None') - # check for an external route + # check for an external route; an external route is one which is + # is a full url (e.g. 'http://example.com/{id}') parsed = urlparse.urlparse(pattern) if parsed.hostname: pattern = parsed.path original_pregenerator = pregenerator def external_url_pregenerator(request, elements, kw): - if '_app_url' not in kw: - if '_scheme' in kw: - scheme = kw['_scheme'] - elif parsed.scheme: - scheme = parsed.scheme - else: - scheme = request.scheme - kw['_app_url'] = '{0}://{1}'.format(scheme, parsed.netloc) + if '_app_url' in kw: + raise ValueError( + 'You cannot generate a path to an external route ' + 'pattern via request.route_path nor pass an _app_url ' + 'to request.route_url when generating a URL for an ' + 'external route pattern (pattern was "%s") ' % + (pattern,) + ) + if '_scheme' in kw: + scheme = kw['_scheme'] + elif parsed.scheme: + scheme = parsed.scheme + else: + scheme = request.scheme + kw['_app_url'] = '{0}://{1}'.format(scheme, parsed.netloc) if original_pregenerator: elements, kw = original_pregenerator( diff --git a/pyramid/tests/test_url.py b/pyramid/tests/test_url.py index 9e4f72c41..6f1ee3bf0 100644 --- a/pyramid/tests/test_url.py +++ b/pyramid/tests/test_url.py @@ -1067,15 +1067,14 @@ class Test_external_static_url_integration(unittest.TestCase): self.config.add_route('acme', 'http://acme.org/path/{foo}') request = self._makeRequest() request.registry = self.config.registry - self.assertEqual( - request.route_url('acme', foo='bar', _app_url='http://fakeme.com'), - 'http://fakeme.com/path/bar') + self.assertRaises(ValueError, + request.route_url, 'acme', foo='bar', _app_url='http://fakeme.com') def test_generate_external_url_route_path(self): self.config.add_route('acme', 'https://acme.org/path/{foo}') request = self._makeRequest() request.registry = self.config.registry - self.assertEqual(request.route_path('acme', foo='bar'), '/path/bar') + self.assertRaises(ValueError, request.route_path, 'acme', foo='bar') def test_generate_external_url_with_pregenerator(self): def pregenerator(request, elements, kw): |
