Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Fixed #878 -- URLconf regex captures no longer have to be named group…

…s. Old URLconfs (with named groups) still work. This is backwards-incompatible if you've defined custom middleware with a process_view function. See http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges

git-svn-id: http://code.djangoproject.com/svn/django/trunk@1470 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit cc3660c07da01965870c3183e740f0694fcf0809 1 parent 8c3b41c
@adrianholovaty adrianholovaty authored
View
6 django/core/handlers/base.py
@@ -62,16 +62,16 @@ def get_response(self, path, request):
resolver = urlresolvers.RegexURLResolver(r'^/', ROOT_URLCONF)
try:
- callback, param_dict = resolver.resolve(path)
+ callback, callback_args, callback_kwargs = resolver.resolve(path)
# Apply view middleware
for middleware_method in self._view_middleware:
- response = middleware_method(request, callback, param_dict)
+ response = middleware_method(request, callback, callback_args, callback_kwargs)
if response:
return response
try:
- response = callback(request, **param_dict)
+ response = callback(request, *callback_args, **callback_kwargs)
except Exception, e:
# If the view raised an exception, run it through exception
# middleware, and if the exception middleware returns a
View
20 django/core/urlresolvers.py
@@ -4,7 +4,7 @@
RegexURLResolver is the main class here. Its resolve() method takes a URL (as
a string) and returns a tuple in this format:
- (view_function, dict_of_view_function_args)
+ (view_function, function_args, function_kwargs)
"""
from django.core.exceptions import Http404, ImproperlyConfigured, ViewDoesNotExist
@@ -31,12 +31,22 @@ def __init__(self, regex, callback, default_args=None):
def resolve(self, path):
match = self.regex.search(path)
if match:
- args = dict(match.groupdict(), **self.default_args)
+ # If there are any named groups, use those as kwargs, ignoring
+ # non-named groups. Otherwise, pass all non-named arguments as
+ # positional arguments.
+ kwargs = match.groupdict()
+ if kwargs:
+ args = ()
+ if not kwargs:
+ args = match.groups()
+ # In both cases, pass any extra_kwargs as **kwargs.
+ kwargs.update(self.default_args)
+
try: # Lazily load self.func.
- return self.func, args
+ return self.func, args, kwargs
except AttributeError:
self.func = self.get_callback()
- return self.func, args
+ return self.func, args, kwargs
def get_callback(self):
mod_name, func_name = get_mod_func(self.callback)
@@ -66,7 +76,7 @@ def resolve(self, path):
tried.extend([(pattern.regex.pattern + ' ' + t) for t in e.args[0]['tried']])
else:
if sub_match:
- return sub_match[0], dict(match.groupdict(), **sub_match[1])
+ return sub_match[0], sub_match[1], dict(match.groupdict(), **sub_match[2])
tried.append(pattern.regex.pattern)
raise Resolver404, {'tried': tried, 'path': new_path}
View
3  django/middleware/doc.py
@@ -5,8 +5,7 @@ class XViewMiddleware:
"""
Adds an X-View header to internal HEAD requests -- used by the documentation system.
"""
-
- def process_view(self, request, view_func, param_dict):
+ def process_view(self, request, view_func, view_args, view_kwargs):
"""
If the request method is HEAD and the IP is internal, quickly return
with an x-header indicating the view function. This is used by the
View
2  django/utils/decorators.py
@@ -13,7 +13,7 @@ def _wrapped_view(request, *args, **kwargs):
if result is not None:
return result
if hasattr(middleware, 'process_view'):
- result = middleware.process_view(request, view_func, **kwargs)
+ result = middleware.process_view(request, view_func, *args, **kwargs)
if result is not None:
return result
try:
Please sign in to comment.
Something went wrong with that request. Please try again.