Browse files

Fixed #15695 -- Added `ResolverMatch` to the request object.

  • Loading branch information...
apollo13 committed Sep 27, 2012
1 parent 44767f2 commit b946db5241b924c72c1079ce30d9b368e2b82f07
@@ -95,14 +95,15 @@ def get_response(self, request):
if response is None:
if hasattr(request, "urlconf"):
if hasattr(request, 'urlconf'):
# Reset url resolver with a custom urlconf.
urlconf = request.urlconf
resolver = urlresolvers.RegexURLResolver(r'^/', urlconf)
callback, callback_args, callback_kwargs = resolver.resolve(
resolver_match = resolver.resolve(request.path_info)
callback, callback_args, callback_kwargs = resolver_match
request.resolver_match = resolver_match
# Apply view middleware
for middleware_method in self._view_middleware:
@@ -192,6 +192,17 @@ All attributes should be considered read-only, unless stated otherwise below.
URLconf for the current request, overriding the :setting:`ROOT_URLCONF`
setting. See :ref:`how-django-processes-a-request` for details.
.. attribute:: HttpRequest.resolver_match
.. versionadded:: 1.5
An instance of :class:`~django.core.urlresolvers.ResolverMatch` representing
the resolved url. This attribute is only set after url resolving took place,
which means it's available in all views but not in middleware methods which
are executed before url resolving takes place (like ``process_request``, you
can use ``process_view`` instead).
@@ -127,6 +127,9 @@ Django 1.5 also includes several smaller improvements worth noting:
configuration duplication. More information can be found in the
:func:`~django.contrib.auth.decorators.login_required` documentation.
* An instance of :class:`~django.core.urlresolvers.ResolverMatch` is stored on
the request as ``resolver_match``.
Backwards incompatible changes in 1.5
@@ -28,6 +28,7 @@ def urls(self):
urlpatterns = patterns('regressiontests.urlpatterns_reverse.views',
url(r'^normal/$', 'empty_view', name='normal-view'),
url(r'^normal/(?P<arg1>\d+)/(?P<arg2>\d+)/$', 'empty_view', name='normal-view'),
url(r'^resolver_match/$', 'pass_resolver_match_view', name='test-resolver-match'),
url(r'^\+\\\$\*/$', 'empty_view', name='special-view'),
@@ -512,6 +512,11 @@ def test_urlpattern_resolve(self):
self.assertEqual(match[1], args)
self.assertEqual(match[2], kwargs)
def test_resolver_match_on_request(self):
response = self.client.get('/resolver_match/')
resolver_match = response.resolver_match
self.assertEqual(resolver_match.url_name, 'test-resolver-match')
class ErroneousViewTests(TestCase):
urls = 'regressiontests.urlpatterns_reverse.erroneous_urls'
@@ -19,6 +19,11 @@ def defaults_view(request, arg1, arg2):
def erroneous_view(request):
import non_existent
def pass_resolver_match_view(request, *args, **kwargs):
response = HttpResponse('')
response.resolver_match = request.resolver_match
return response
uncallable = "Can I be a view? Pleeeease?"
class ViewClass(object):

0 comments on commit b946db5

Please sign in to comment.