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.
This commit is contained in:
Julien Phalip 2012-07-21 13:30:34 -07:00
parent 9ecd978e26
commit 1af0271d7c
3 changed files with 17 additions and 1 deletions

View File

@ -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]

View File

@ -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'),
)

View File

@ -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')