Browse Source

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.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10037 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Malcolm Tredinnick 16 years ago
parent
commit
fb729cf1d9
2 changed files with 6 additions and 3 deletions
  1. 1 0
      AUTHORS
  2. 5 3
      django/core/urlresolvers.py

+ 1 - 0
AUTHORS

@@ -402,6 +402,7 @@ answer newbie questions, and generally made Django that much better:
     Frank Tegtmeyer <fte@fte.to>
     Marcel Telka <marcel@telka.sk>
     Terry Huang <terryh.tp@gmail.com>
+    Travis Terry <tdterry7@gmail.com>
     thebjorn <bp@datakortet.no>
     Zach Thompson <zthompson47@gmail.com>
     Michael Thornhill

+ 5 - 3
django/core/urlresolvers.py

@@ -154,6 +154,7 @@ class RegexURLResolver(object):
 
     def _get_reverse_dict(self):
         if not self._reverse_dict:
+            lookups = MultiValueDict()
             for pattern in reversed(self.url_patterns):
                 p_pattern = pattern.regex.pattern
                 if p_pattern.startswith('^'):
@@ -165,11 +166,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)