Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed reverse URL lookup using functions when the original URL patter…

…n was a

string. This is now just as fragile as it was prior to [5609], but works in a
few cases that people were relying on, apparently.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@5632 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit b6812f2d9d1bea3bdc9c5f9a747c5c71c764fa0f 1 parent 4c011e6
@malcolmt malcolmt authored
Showing with 20 additions and 20 deletions.
  1. +13 −15 django/core/urlresolvers.py
  2. +7 −5 django/utils/functional.py
View
28 django/core/urlresolvers.py
@@ -38,29 +38,27 @@ def get_callable(lookup_view, can_fail=False):
If can_fail is True, lookup_view might be a URL pattern label, so errors
during the import fail and the string is returned.
"""
- try:
- # Bail out early if lookup_view is not ASCII. This can't be a function.
- lookup_view = lookup_view.encode('ascii')
-
- if not callable(lookup_view):
+ if not callable(lookup_view):
+ try:
+ # Bail early for non-ASCII strings (they can't be functions).
+ lookup_view = lookup_view.encode('ascii')
mod_name, func_name = get_mod_func(lookup_view)
- try:
- if func_name != '':
- lookup_view = getattr(__import__(mod_name, {}, {}, ['']), func_name)
- except (ImportError, AttributeError):
- if not can_fail:
- raise
- except UnicodeEncodeError:
- pass
+ if func_name != '':
+ lookup_view = getattr(__import__(mod_name, {}, {}, ['']), func_name)
+ except (ImportError, AttributeError):
+ if not can_fail:
+ raise
+ except UnicodeEncodeError:
+ pass
return lookup_view
-get_callable = memoize(get_callable, _callable_cache)
+get_callable = memoize(get_callable, _callable_cache, 1)
def get_resolver(urlconf):
if urlconf is None:
from django.conf import settings
urlconf = settings.ROOT_URLCONF
return RegexURLResolver(r'^/', urlconf)
-get_resolver = memoize(get_resolver, _resolver_cache)
+get_resolver = memoize(get_resolver, _resolver_cache, 1)
def get_mod_func(callback):
# Converts 'django.views.news.stories.story_detail' to
View
12 django/utils/functional.py
@@ -3,18 +3,20 @@ def _curried(*moreargs, **morekwargs):
return _curried_func(*(args+moreargs), **dict(kwargs, **morekwargs))
return _curried
-def memoize(func, cache):
+def memoize(func, cache, num_args):
"""
Wrap a function so that results for any argument tuple are stored in
'cache'. Note that the args to the function must be usable as dictionary
keys.
+
+ Only the first num_args are considered when creating the key.
"""
def wrapper(*args):
- if args in cache:
- return cache[args]
-
+ mem_args = args[:num_args]
+ if mem_args in cache:
+ return cache[mem_args]
result = func(*args)
- cache[args] = result
+ cache[mem_args] = result
return result
return wrapper
Please sign in to comment.
Something went wrong with that request. Please try again.