mirror of https://github.com/django/django.git
Fixed #15695 -- Added `ResolverMatch` to the request object.
This commit is contained in:
parent
44767f2caf
commit
b946db5241
|
@ -95,14 +95,15 @@ class BaseHandler(object):
|
|||
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:
|
||||
|
|
|
@ -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
|
||||
-------
|
||||
|
||||
|
|
|
@ -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 @@ otherobj2 = URLObject('nodefault', 'other-ns2')
|
|||
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 @@ class ResolverMatchTests(TestCase):
|
|||
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):
|
||||
|
|
Loading…
Reference in New Issue