Code

Ticket #15894: sites-cache.diff

File sites-cache.diff, 3.5 KB (added by fcurella, 3 years ago)

better patch, with tests

Line 
1Index: tests/regressiontests/sites_framework/tests.py
2===================================================================
3--- tests/regressiontests/sites_framework/tests.py      (revision 16549)
4+++ tests/regressiontests/sites_framework/tests.py      (working copy)
5@@ -1,3 +1,6 @@
6+import time
7+from multiprocessing import Process, Queue
8+
9 from django.conf import settings
10 from django.contrib.sites.models import Site
11 from django.test import TestCase
12@@ -32,3 +35,35 @@
13     def test_invalid_field_type(self):
14         article = ConfusedArticle.objects.create(title="More Bad News!", site=settings.SITE_ID)
15         self.assertRaises(TypeError, ConfusedArticle.on_site.all)
16+   
17+    def test_multiprocess(self):
18+        def first_process(q):
19+            from django.contrib.sites.models import Site
20+            s = Site.objects.get_current()
21+            first_try = s.domain
22+            time.sleep(2)
23+            s2 = Site.objects.get_current()
24+            second_try = s2.domain
25+            are_equals = (first_try == second_try)
26+            q.put([are_equals])
27+
28+        def second_process(q):
29+            from django.contrib.sites.models import Site
30+            s = Site.objects.get_current()
31+            time.sleep(1)
32+            s.domain = s.domain+'_changed'
33+            s.save()
34+
35+        q = Queue()
36+        p1 = Process(target=first_process, args=(q,))
37+        p2 = Process(target=second_process, args=(q,))
38+        try:
39+            p1.start()
40+            p2.start()
41+            p1.join()
42+            p2.join()
43+        except:
44+            p1.terminate()
45+            p2.terminate()
46+        self.assertFalse(q.get()[0])
47+        q.close()
48Index: django/contrib/sites/models.py
49===================================================================
50--- django/contrib/sites/models.py      (revision 16549)
51+++ django/contrib/sites/models.py      (working copy)
52@@ -1,10 +1,8 @@
53 from django.db import models
54 from django.utils.translation import ugettext_lazy as _
55+from django.core.cache import cache
56 
57 
58-SITE_CACHE = {}
59-
60-
61 class SiteManager(models.Manager):
62 
63     def get_current(self):
64@@ -19,17 +17,17 @@
65         except AttributeError:
66             from django.core.exceptions import ImproperlyConfigured
67             raise ImproperlyConfigured("You're using the Django \"sites framework\" without having set the SITE_ID setting. Create a site in your database and set the SITE_ID setting to fix this error.")
68-        try:
69-            current_site = SITE_CACHE[sid]
70-        except KeyError:
71+
72+        current_site = cache.get('site-cache-%s' % sid)
73+        if current_site is None:
74             current_site = self.get(pk=sid)
75-            SITE_CACHE[sid] = current_site
76+            cache.set('site-cache-%s' % sid, current_site)
77         return current_site
78 
79     def clear_cache(self):
80         """Clears the ``Site`` object cache."""
81-        global SITE_CACHE
82-        SITE_CACHE = {}
83+        for s in self.all():
84+            cache.delete('site-cache-%s' % s.id)
85 
86 
87 class Site(models.Model):
88@@ -50,16 +48,12 @@
89     def save(self, *args, **kwargs):
90         super(Site, self).save(*args, **kwargs)
91         # Cached information will likely be incorrect now.
92-        if self.id in SITE_CACHE:
93-            del SITE_CACHE[self.id]
94+        cache.delete('site-cache-%s' % self.id)
95 
96     def delete(self):
97         pk = self.pk
98         super(Site, self).delete()
99-        try:
100-            del SITE_CACHE[pk]
101-        except KeyError:
102-            pass
103+        cache.delete('site-cache-%s' % self.id)
104 
105 
106 class RequestSite(object):