From 6adcf4bc7cff8b7bcba17653fbe15fbe3080bd45 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 8 Nov 2016 16:03:06 +0100 Subject: [PATCH] Use more caching in multidomain module --- src/pretix/control/middleware.py | 2 +- src/pretix/multidomain/middlewares.py | 25 ++++++++++++++++++------- src/pretix/multidomain/models.py | 3 +++ src/pretix/presale/utils.py | 5 ++--- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/pretix/control/middleware.py b/src/pretix/control/middleware.py index 8f47af64b8..28350cb031 100644 --- a/src/pretix/control/middleware.py +++ b/src/pretix/control/middleware.py @@ -33,7 +33,7 @@ class PermissionMiddleware(MiddlewareMixin): if not request.path.startswith(get_script_prefix() + 'control'): # This middleware should only touch the /control subpath return - if hasattr(request, 'domain'): + if hasattr(request, 'organizer'): # If the user is on a organizer's subdomain, he should be redirected to pretix return redirect(urljoin(settings.SITE_URL, request.get_full_path())) if url_name in self.EXCEPTIONS: diff --git a/src/pretix/multidomain/middlewares.py b/src/pretix/multidomain/middlewares.py index 6b4b9103ec..87cc33ca89 100644 --- a/src/pretix/multidomain/middlewares.py +++ b/src/pretix/multidomain/middlewares.py @@ -4,6 +4,7 @@ from urllib.parse import urlparse from django.conf import settings from django.contrib.sessions.middleware import \ SessionMiddleware as BaseSessionMiddleware +from django.core.cache import cache from django.core.exceptions import DisallowedHost from django.core.urlresolvers import set_urlconf from django.http.request import split_domain_port @@ -12,6 +13,7 @@ from django.utils.cache import patch_vary_headers from django.utils.deprecation import MiddlewareMixin from django.utils.http import cookie_date +from pretix.base.models import Organizer from pretix.multidomain.models import KnownDomain LOCAL_HOST_NAMES = ('testserver', 'localhost') @@ -36,17 +38,26 @@ class MultiDomainMiddleware(MiddlewareMixin): if domain: request.host = domain request.port = int(port) if port else None - try: - kd = KnownDomain.objects.get(domainname=domain) # noqa - request.domain = kd - except: + + orga = cache.get('pretix_multidomain_organizer_{}'.format(domain)) + if orga is None: + try: + kd = KnownDomain.objects.select_related('organizer').get(domainname=domain) # noqa + orga = kd.organizer + except KnownDomain.DoesNotExist: + orga = False + cache.set('pretix_multidomain_organizer_{}'.format(domain), orga.pk if orga else False, 3600) + + if orga: + print(orga) + request.organizer = orga if isinstance(orga, Organizer) else Organizer.objects.get(pk=orga) + request.urlconf = "pretix.multidomain.subdomain_urlconf" + else: if settings.DEBUG or domain in LOCAL_HOST_NAMES or domain == default_domain: request.urlconf = "pretix.multidomain.maindomain_urlconf" else: raise DisallowedHost("Unknown host: %r" % host) - else: - request.organizer = kd.organizer - request.urlconf = "pretix.multidomain.subdomain_urlconf" + else: raise DisallowedHost("Invalid HTTP_HOST header: %r." % host) diff --git a/src/pretix/multidomain/models.py b/src/pretix/multidomain/models.py index b9fd3895d3..23606a2346 100644 --- a/src/pretix/multidomain/models.py +++ b/src/pretix/multidomain/models.py @@ -1,3 +1,4 @@ +from django.core.cache import cache from django.db import models from django.utils.translation import ugettext_lazy as _ @@ -19,8 +20,10 @@ class KnownDomain(models.Model): super().save(*args, **kwargs) if self.organizer: self.organizer.get_cache().clear() + cache.delete('pretix_multidomain_organizer_{}'.format(self.domainname)) def delete(self, *args, **kwargs): if self.organizer: self.organizer.get_cache().clear() + cache.delete('pretix_multidomain_organizer_{}'.format(self.domainname)) super().delete(*args, **kwargs) diff --git a/src/pretix/presale/utils.py b/src/pretix/presale/utils.py index 8fb5e16e08..264717ae4e 100644 --- a/src/pretix/presale/utils.py +++ b/src/pretix/presale/utils.py @@ -23,13 +23,12 @@ def _detect_event(request): path = "/" + request.get_full_path().split("/", 2)[-1] return redirect(path) - request.event = Event.objects\ - .select_related('organizer')\ + request.event = request.organizer.events\ .get( slug=url.kwargs['event'], organizer=request.organizer, ) - request.organizer = request.event.organizer + request.organizer = request.organizer else: # We are on our main domain if 'event' in url.kwargs and 'organizer' in url.kwargs: