Просмотр исходного кода

Implemented 2-step contex initialisation, hanged way crawler sessions are identified by ORM (Issue #56)

Ralfp 12 лет назад
Родитель
Сommit
c5805dd8be
2 измененных файлов с 29 добавлено и 23 удалено
  1. 11 9
      misago/context_processors.py
  2. 18 14
      misago/sessions.py

+ 11 - 9
misago/context_processors.py

@@ -5,13 +5,9 @@ from misago.models import Forum
 
 def common(request):
     try:
-        return {
+        context = {
             'acl': request.acl,
             'board_address': settings.BOARD_ADDRESS,
-            'csrf_id': request.csrf.csrf_id,
-            'csrf_token': request.csrf.csrf_token,
-            'is_banned': request.ban.is_banned(),
-            'is_jammed': request.jam.is_jammed(),
             'messages' : request.messages.messages,
             'monitor': request.monitor,
             'request_path': request.get_full_path(),
@@ -19,12 +15,18 @@ def common(request):
             'stopwatch': request.stopwatch.time(),
             'user': request.user,
             'version': __version__,
+        }
+        context.update({
+            'csrf_id': request.csrf.csrf_id,
+            'csrf_token': request.csrf.csrf_token,
+            'is_banned': request.ban.is_banned(),
+            'is_jammed': request.jam.is_jammed(),
             'private_threads': Forum.objects.special_model('private_threads'),
             'reports': Forum.objects.special_model('reports'),
-        }
-    except AttributeError:
-        # If request lacks required service, let template crash in context processor's stead
-        return  {}
+        })
+    except AttributeError as e:
+        pass
+    return context
 
 
 def admin(request):

+ 18 - 14
misago/sessions.py

@@ -1,3 +1,4 @@
+from hashlib import md5
 from datetime import timedelta
 from django.conf import settings
 from django.contrib.sessions.backends.base import SessionBase, CreateError
@@ -71,7 +72,10 @@ class MisagoSession(SessionBase):
     def save(self):
         self._session_rk.data = self.encode(self._get_session())
         self._session_rk.last = timezone.now()
-        self._session_rk.save(force_update=True)
+        if self._session_rk.pk:
+            self._session_rk.save(force_update=True)
+        else:
+            self._session_rk.save(force_insert=True)
 
 
 class CrawlerSession(MisagoSession):
@@ -82,30 +86,30 @@ class CrawlerSession(MisagoSession):
         self.hidden = False
         self.team = False
         self._ip = self.get_ip(request)
+        self._session_key = md5('%s-%s' % (request.user.username, self._ip)).hexdigest()
         try:
-            self._session_rk = Session.objects.get(crawler=request.user.username, ip=self._ip)
+            self._session_rk = Session.objects.get(id=self._session_key)
             self._session_key = self._session_rk.id
         except Session.DoesNotExist:
             self.create(request)
 
     def create(self, request):
+        self._session_rk = Session(
+                                   id=self._session_key,
+                                   data=self.encode({}),
+                                   crawler=request.user.username,
+                                   ip=self._ip,
+                                   agent=request.META.get('HTTP_USER_AGENT', ''),
+                                   start=timezone.now(),
+                                   last=timezone.now(),
+                                   matched=True
+                                   )
         while True:
             try:
-                self._session_key = self._get_new_session_key()
-                self._session_rk = Session(
-                                         id=self._session_key,
-                                         data=self.encode({}),
-                                         crawler=request.user.username,
-                                         ip=self._ip,
-                                         agent=request.META.get('HTTP_USER_AGENT', ''),
-                                         start=timezone.now(),
-                                         last=timezone.now(),
-                                         matched=True
-                                         )
                 self._session_rk.save(force_insert=True)
                 break
             except CreateError:
-                # Key wasn't unique. Try again.
+                # Key wasn't unique, we'll try again after request ends
                 continue
 
     def human_session(self):