diff --git a/django/core/handlers/base.py b/django/core/handlers/base.py index 755df23752..23f04ecd9d 100644 --- a/django/core/handlers/base.py +++ b/django/core/handlers/base.py @@ -62,16 +62,16 @@ class BaseHandler: 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 diff --git a/django/core/urlresolvers.py b/django/core/urlresolvers.py index 95cc914676..9582dd4d81 100644 --- a/django/core/urlresolvers.py +++ b/django/core/urlresolvers.py @@ -4,7 +4,7 @@ This module converts requested URLs to callback view functions. 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 @@ class RegexURLPattern: 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 @@ class RegexURLResolver(object): 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} diff --git a/django/middleware/doc.py b/django/middleware/doc.py index 9345dbfcef..c96be2c0f6 100644 --- a/django/middleware/doc.py +++ b/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 diff --git a/django/utils/decorators.py b/django/utils/decorators.py index 3ec5b4cbbf..1c6cc8c7de 100644 --- a/django/utils/decorators.py +++ b/django/utils/decorators.py @@ -13,7 +13,7 @@ def decorator_from_middleware(middleware_class): 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: