Skip to content

Commit 859fc02

Browse files
committed
Fixed #5350 -- Added fallback to default 404/500 handlers when they're not explicitly specified (or imported) in a urls.py file. Thanks to Thomas Güttler for the report and initial patch.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@13590 bcc190cf-cafb-0310-a4f2-bffc1f526a37
1 parent 7e52bb2 commit 859fc02

File tree

3 files changed

+31
-5
lines changed

3 files changed

+31
-5
lines changed

django/core/urlresolvers.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,12 @@ def _get_url_patterns(self):
284284
url_patterns = property(_get_url_patterns)
285285

286286
def _resolve_special(self, view_type):
287-
callback = getattr(self.urlconf_module, 'handler%s' % view_type)
287+
callback = getattr(self.urlconf_module, 'handler%s' % view_type, None)
288+
if not callback:
289+
# No handler specified in file; use default
290+
# Lazy import, since urls.defaults imports this file
291+
from django.conf.urls import defaults
292+
callback = getattr(defaults, 'handler%s' % view_type)
288293
try:
289294
return get_callable(callback), {}
290295
except (ImportError, AttributeError), e:

tests/regressiontests/urlpatterns_reverse/tests.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,22 @@ def test_callable_handers(self):
356356
self.assertEqual(self.callable_resolver.resolve404(), handler)
357357
self.assertEqual(self.callable_resolver.resolve500(), handler)
358358

359+
class DefaultErrorHandlerTests(TestCase):
360+
urls = 'regressiontests.urlpatterns_reverse.urls_without_full_import'
361+
362+
def test_default_handler(self):
363+
"If the urls.py doesn't specify handlers, the defaults are used"
364+
try:
365+
response = self.client.get('/test/')
366+
self.assertEquals(response.status_code, 404)
367+
except AttributeError:
368+
self.fail("Shouldn't get an AttributeError due to undefined 404 handler")
369+
370+
try:
371+
self.assertRaises(ValueError, self.client.get, '/bad_view/')
372+
except AttributeError:
373+
self.fail("Shouldn't get an AttributeError due to undefined 500 handler")
374+
359375
class NoRootUrlConfTests(TestCase):
360376
"""Tests for handler404 and handler500 if urlconf is None"""
361377
urls = None
Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
1+
from django.http import HttpResponse
2+
13
def empty_view(request, *args, **kwargs):
2-
pass
4+
return HttpResponse('')
35

46
def kwargs_view(request, arg1=1, arg2=2):
5-
pass
7+
return HttpResponse('')
68

79
def absolute_kwargs_view(request, arg1=1, arg2=2):
8-
pass
10+
return HttpResponse('')
911

1012
class ViewClass(object):
1113
def __call__(self, request, *args, **kwargs):
12-
pass
14+
return HttpResponse('')
1315

1416
view_class_instance = ViewClass()
17+
18+
def bad_view(request, *args, **kwargs):
19+
raise ValueError("I don't think I'm getting good value for this view")

0 commit comments

Comments
 (0)