From a02247ff73c14a79b344faaaa865d7d57d755cb1 Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Thu, 12 Mar 2009 07:37:37 +0000 Subject: [PATCH] [1.0.X] Fixed #10472 -- Fixed a race condition in reverse URL resolving. This only shows up in for reverse() (not forwards resolving), since that path uses a globally shared resolver object. Based on a patch from Travis Terry. Backport of r10037 from trunk. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@10039 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- AUTHORS | 1 + django/core/urlresolvers.py | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/AUTHORS b/AUTHORS index 0ed198ec92..90e52c7d0c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -393,6 +393,7 @@ answer newbie questions, and generally made Django that much better: Frank Tegtmeyer Marcel Telka Terry Huang + Travis Terry thebjorn Zach Thompson Michael Thornhill diff --git a/django/core/urlresolvers.py b/django/core/urlresolvers.py index 774e6d3b42..c61cdde65a 100644 --- a/django/core/urlresolvers.py +++ b/django/core/urlresolvers.py @@ -152,6 +152,7 @@ class RegexURLResolver(object): def _get_reverse_dict(self): if not self._reverse_dict and hasattr(self.urlconf_module, 'urlpatterns'): + lookups = MultiValueDict() for pattern in reversed(self.urlconf_module.urlpatterns): p_pattern = pattern.regex.pattern if p_pattern.startswith('^'): @@ -163,11 +164,12 @@ class RegexURLResolver(object): new_matches = [] for piece, p_args in parent: new_matches.extend([(piece + suffix, p_args + args) for (suffix, args) in matches]) - self._reverse_dict.appendlist(name, (new_matches, p_pattern + pat)) + lookups.appendlist(name, (new_matches, p_pattern + pat)) else: bits = normalize(p_pattern) - self._reverse_dict.appendlist(pattern.callback, (bits, p_pattern)) - self._reverse_dict.appendlist(pattern.name, (bits, p_pattern)) + lookups.appendlist(pattern.callback, (bits, p_pattern)) + lookups.appendlist(pattern.name, (bits, p_pattern)) + self._reverse_dict = lookups return self._reverse_dict reverse_dict = property(_get_reverse_dict)