Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

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

Merged
merged 1 commit into from

1 participant

@apollo13
Owner

No description provided.

@apollo13
Owner

Ignore travis, that's my stupid setup :/

@apollo13 apollo13 merged commit b946db5 into django:master
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
This page is out of date. Refresh to see the latest.
View
7 django/core/handlers/base.py
@@ -95,14 +95,15 @@ def get_response(self, request):
break
if response is None:
- if hasattr(request, "urlconf"):
+ if hasattr(request, 'urlconf'):
# Reset url resolver with a custom urlconf.
urlconf = request.urlconf
urlresolvers.set_urlconf(urlconf)
resolver = urlresolvers.RegexURLResolver(r'^/', urlconf)
- callback, callback_args, callback_kwargs = resolver.resolve(
- request.path_info)
+ 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:
View
11 docs/ref/request-response.txt
@@ -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).
+
+
Methods
-------
View
3  docs/releases/1.5.txt
@@ -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
=====================================
View
1  tests/regressiontests/urlpatterns_reverse/namespace_urls.py
@@ -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'),
View
5 tests/regressiontests/urlpatterns_reverse/tests.py
@@ -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'
View
5 tests/regressiontests/urlpatterns_reverse/views.py
@@ -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):
Something went wrong with that request. Please try again.