diff options
| author | Adrian Holovaty <adrian@holovaty.com> | 2005-11-27 22:08:51 +0000 |
|---|---|---|
| committer | Adrian Holovaty <adrian@holovaty.com> | 2005-11-27 22:08:51 +0000 |
| commit | cc3660c07da01965870c3183e740f0694fcf0809 (patch) | |
| tree | 3b6380d9b4d0a1c04c0fc65ba71c3473644f2252 /django/core | |
| parent | 8c3b41c3e90f6462c7f2142243c7e3e62169683f (diff) | |
Fixed #878 -- URLconf regex captures no longer have to be named groups. 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
Diffstat (limited to 'django/core')
| -rw-r--r-- | django/core/handlers/base.py | 6 | ||||
| -rw-r--r-- | django/core/urlresolvers.py | 20 |
2 files changed, 18 insertions, 8 deletions
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} |
