From 1af0271d7c6f5ecda2247a2b363d25f493c7b05a Mon Sep 17 00:00:00 2001 From: Julien Phalip Date: Sat, 21 Jul 2012 13:30:34 -0700 Subject: [PATCH] Fixed #6170 -- Ensured that a useful exception is raised when a regex is invalid in the URLConf. Thanks to abrahamson.j for the report, to guettli for initial work on the patch, and to David Gouldin for the new patch and test. --- django/core/urlresolvers.py | 8 +++++++- .../regressiontests/urlpatterns_reverse/erroneous_urls.py | 2 ++ tests/regressiontests/urlpatterns_reverse/tests.py | 8 ++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/django/core/urlresolvers.py b/django/core/urlresolvers.py index 625ec6348b..58213a3a73 100644 --- a/django/core/urlresolvers.py +++ b/django/core/urlresolvers.py @@ -160,10 +160,16 @@ class LocaleRegexProvider(object): language_code = get_language() if language_code not in self._regex_dict: if isinstance(self._regex, basestring): - compiled_regex = re.compile(self._regex, re.UNICODE) + regex = self._regex else: regex = force_unicode(self._regex) + try: compiled_regex = re.compile(regex, re.UNICODE) + except re.error, e: + raise ImproperlyConfigured( + u'"%s" is not a valid regular expression: %s' % + (regex, unicode(e))) + self._regex_dict[language_code] = compiled_regex return self._regex_dict[language_code] diff --git a/tests/regressiontests/urlpatterns_reverse/erroneous_urls.py b/tests/regressiontests/urlpatterns_reverse/erroneous_urls.py index 8e6433e16e..d1e4f3db5d 100644 --- a/tests/regressiontests/urlpatterns_reverse/erroneous_urls.py +++ b/tests/regressiontests/urlpatterns_reverse/erroneous_urls.py @@ -11,4 +11,6 @@ urlpatterns = patterns('', url(r'uncallable/$', 'regressiontests.urlpatterns_reverse.views.uncallable'), # Module does not exist url(r'missing_outer/$', 'regressiontests.urlpatterns_reverse.missing_module.missing_view'), + # Regex contains an error (refs #6170) + url(r'(regex_error/$', 'regressiontestes.urlpatterns_reverse.views.empty_view'), ) diff --git a/tests/regressiontests/urlpatterns_reverse/tests.py b/tests/regressiontests/urlpatterns_reverse/tests.py index bb25806830..500a0e0327 100644 --- a/tests/regressiontests/urlpatterns_reverse/tests.py +++ b/tests/regressiontests/urlpatterns_reverse/tests.py @@ -511,3 +511,11 @@ class ErroneousViewTests(TestCase): self.assertRaises(ViewDoesNotExist, self.client.get, '/missing_outer/') self.assertRaises(ViewDoesNotExist, self.client.get, '/uncallable/') + def test_erroneous_reverse(self): + """ + Ensure that a useful exception is raised when a regex is invalid in the + URLConf. + Refs #6170. + """ + # The regex error will be hit before NoReverseMatch can be raised + self.assertRaises(ImproperlyConfigured, reverse, 'whatever blah blah')