Browse Source

optimization: preload data for ember app lazily (in context processors) instead of greedily (on every request)

Rafał Pitoń 10 years ago
parent
commit
3ad7a23151

+ 26 - 2
misago/conf/context_processors.py

@@ -1,7 +1,7 @@
 import json
 import json
 
 
-from django.conf import settings as dj_settings
-from misago.conf.dbsettings import db_settings
+from django.core.urlresolvers import reverse
+from misago.conf.gateway import dj_settings, db_settings  # noqa
 
 
 
 
 def settings(request):
 def settings(request):
@@ -13,3 +13,27 @@ def settings(request):
         'LOGIN_URL': dj_settings.LOGIN_URL,
         'LOGIN_URL': dj_settings.LOGIN_URL,
         'LOGOUT_URL': dj_settings.LOGOUT_URL,
         'LOGOUT_URL': dj_settings.LOGOUT_URL,
     }
     }
+
+
+def preload_config_json(request):
+    preloaded_settings = db_settings.get_public_settings()
+
+    preloaded_settings.update({
+        'loginApiUrl': dj_settings.MISAGO_LOGIN_API_URL,
+
+        'loginRedirectUrl': reverse(dj_settings.LOGIN_REDIRECT_URL),
+        'loginUrl': reverse(dj_settings.LOGIN_URL),
+
+        'logoutUrl': reverse(dj_settings.LOGOUT_URL),
+    })
+
+    request.preloaded_ember_data.update({
+        'misagoSettings': preloaded_settings,
+
+        'staticUrl': dj_settings.STATIC_URL,
+        'mediaUrl': dj_settings.MEDIA_URL,
+
+        'csrfCookieName': dj_settings.CSRF_COOKIE_NAME,
+    })
+
+    return {}

+ 6 - 3
misago/conf/defaults.py

@@ -121,14 +121,12 @@ MIDDLEWARE_CLASSES = (
     'misago.users.middleware.AvatarServerMiddleware',
     'misago.users.middleware.AvatarServerMiddleware',
     'misago.users.middleware.RealIPMiddleware',
     'misago.users.middleware.RealIPMiddleware',
     'misago.core.middleware.preloademberdata.PreloadEmberDataMiddleware',
     'misago.core.middleware.preloademberdata.PreloadEmberDataMiddleware',
-    'misago.conf.middleware.PreloadConfigMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.common.CommonMiddleware',
     'django.middleware.common.CommonMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
     'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
     'misago.users.middleware.UserMiddleware',
     'misago.users.middleware.UserMiddleware',
-    'misago.users.middleware.PreloadUserMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware',
     'misago.core.middleware.exceptionhandler.ExceptionHandlerMiddleware',
     'misago.core.middleware.exceptionhandler.ExceptionHandlerMiddleware',
@@ -147,9 +145,14 @@ TEMPLATE_CONTEXT_PROCESSORS = (
     'django.core.context_processors.tz',
     'django.core.context_processors.tz',
     'django.contrib.messages.context_processors.messages',
     'django.contrib.messages.context_processors.messages',
     'misago.core.context_processors.site_address',
     'misago.core.context_processors.site_address',
-    'misago.core.context_processors.preloaded_ember_data',
     'misago.conf.context_processors.settings',
     'misago.conf.context_processors.settings',
     'misago.users.context_processors.sites_links',
     'misago.users.context_processors.sites_links',
+    # Preloading data
+    'misago.conf.context_processors.preload_config_json',
+    'misago.users.context_processors.preload_user_json',
+    # Note: keep preloaded_ember_data processor last for previous processors
+    # to be able to add data to request.preloaded_ember_data
+    'misago.core.context_processors.preloaded_ember_data',
 )
 )
 
 
 MISAGO_ACL_EXTENSIONS = (
 MISAGO_ACL_EXTENSIONS = (

+ 0 - 24
misago/conf/middleware.py

@@ -1,24 +0,0 @@
-from django.core.urlresolvers import reverse
-from misago.conf.gateway import settings, db_settings  # noqa
-
-
-class PreloadConfigMiddleware(object):
-    def process_request(self, request):
-        preloaded_settings = db_settings.get_public_settings()
-        preloaded_settings.update({
-            'loginApiUrl': settings.MISAGO_LOGIN_API_URL,
-
-            'loginRedirectUrl': reverse(settings.LOGIN_REDIRECT_URL),
-            'loginUrl': reverse(settings.LOGIN_URL),
-
-            'logoutUrl': reverse(settings.LOGOUT_URL),
-        })
-
-        request.preloaded_ember_data.update({
-            'misagoSettings': preloaded_settings,
-
-            'staticUrl': settings.STATIC_URL,
-            'mediaUrl': settings.MEDIA_URL,
-
-            'csrfCookieName': settings.CSRF_COOKIE_NAME,
-        })

+ 0 - 25
misago/conf/tests/test_preloadconfig_middleware.py

@@ -1,25 +0,0 @@
-from django.test import TestCase
-from misago.conf.middleware import PreloadConfigMiddleware
-
-
-class MockRequest(object):
-    def __init__(self):
-        self.preloaded_ember_data = {}
-
-
-class PreloadConfigMiddlewareTests(TestCase):
-    def test_middleware_preloads_configuration(self):
-        """Middleware sets keys in preloaded_ember_data dict on request"""
-        request = MockRequest()
-
-        PreloadConfigMiddleware().process_request(request)
-
-        MIDDLEWARE_KEYS = (
-            'misagoSettings',
-
-            'staticUrl',
-            'mediaUrl',
-        )
-
-        for key in MIDDLEWARE_KEYS:
-            self.assertIn(key, request.preloaded_ember_data)

+ 19 - 0
misago/users/context_processors.py

@@ -1,3 +1,5 @@
+from misago.users.serializers import (AuthenticatedUserSerializer,
+                                      AnonymousUserSerializer)
 from misago.users.sites import usercp, users_list, user_profile
 from misago.users.sites import usercp, users_list, user_profile
 
 
 
 
@@ -7,3 +9,20 @@ def sites_links(request):
         'USERS_LIST_URL': users_list.get_default_link(),
         'USERS_LIST_URL': users_list.get_default_link(),
         'USER_PROFILE_URL': user_profile.get_default_link(),
         'USER_PROFILE_URL': user_profile.get_default_link(),
     }
     }
+
+
+def preload_user_json(request):
+    request.preloaded_ember_data.update({
+        'isAuthenticated': request.user.is_authenticated(),
+    })
+
+    if request.user.is_authenticated():
+        request.preloaded_ember_data.update({
+            'user': AuthenticatedUserSerializer(request.user).data
+        })
+    else:
+        request.preloaded_ember_data.update({
+            'user': AnonymousUserSerializer(request.user).data
+        })
+
+    return {}

+ 0 - 18
misago/users/middleware.py

@@ -9,8 +9,6 @@ from misago.conf import settings
 from misago.users.bans import get_request_ip_ban, get_user_ban
 from misago.users.bans import get_request_ip_ban, get_user_ban
 from misago.users.models import AnonymousUser, Online
 from misago.users.models import AnonymousUser, Online
 from misago.users.online import tracker
 from misago.users.online import tracker
-from misago.users.serializers import (AuthenticatedUserSerializer,
-                                      AnonymousUserSerializer)
 
 
 
 
 class RealIPMiddleware(object):
 class RealIPMiddleware(object):
@@ -39,22 +37,6 @@ class UserMiddleware(object):
                 logout(request)
                 logout(request)
 
 
 
 
-class PreloadUserMiddleware(object):
-    def process_request(self, request):
-        request.preloaded_ember_data.update({
-            'isAuthenticated': request.user.is_authenticated(),
-        })
-
-        if request.user.is_authenticated():
-            request.preloaded_ember_data.update({
-                'user': AuthenticatedUserSerializer(request.user).data
-            })
-        else:
-            request.preloaded_ember_data.update({
-                'user': AnonymousUserSerializer(request.user).data
-            })
-
-
 class OnlineTrackerMiddleware(object):
 class OnlineTrackerMiddleware(object):
     def process_request(self, request):
     def process_request(self, request):
         if request.user.is_authenticated():
         if request.user.is_authenticated():