From f1fe5cbd1ebfee1d77d7013d1d0cbd24fe9b4b82 Mon Sep 17 00:00:00 2001 From: Julia Luna Date: Sun, 19 Jun 2022 12:31:51 +0200 Subject: [PATCH] add async support to middlewares --- scopedsites/middleware.py | 37 ++++++++++++++++++++++++++++++------- setup.py | 2 +- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/scopedsites/middleware.py b/scopedsites/middleware.py index 69a6ab6..95284a0 100644 --- a/scopedsites/middleware.py +++ b/scopedsites/middleware.py @@ -1,3 +1,5 @@ +import asyncio + from django.http import Http404 from django_scopes import scope @@ -5,22 +7,39 @@ from scopedsites.models import Domain class DomainScopeMiddleware: + async_capable = True + def __init__(self, get_response): self.get_response = get_response - def __call__(self, request): + self.is_async = asyncio.iscoroutinefunction(get_response) + + self.__call__ = self._ahandler if self.is_async else self._handler + + async def _ahandler(self, request): + d = Domain.get_from_request(request) + + with scope(domain=d): + return await self.get_response(request) + + def _handler(self, request): d = Domain.get_from_request(request) # technically does hit the db layer, but should get caught in memcache # TODO: performance testing with scope(domain=d): - response = self.get_response(request) - - return response + return self.get_response(request) class DomainAutoCreateMiddleware: + async_capable = True + def __init__(self, get_response): self.get_response = get_response + + self.is_async = asyncio.iscoroutinefunction(get_response) + + self.__call__ = self._ahandler if self.is_async else self._handler + self.cache = set() def ensure_exists(self, r): @@ -33,6 +52,10 @@ class DomainAutoCreateMiddleware: except Http404: Domain.objects.create(fqdn=r.META.get('HTTP_HOST')) - def __call__(self, request): - self.ensure_exists(request) - return self.get_response(request) + def _handler(self, req): + self.ensure_exists(req) + return self.get_response(req) + + async def _ahandler(self, req): + self.ensure_exists(req) + return await self.get_response(req) diff --git a/setup.py b/setup.py index ba2e343..2fb9951 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup setup( name="django_scopedsites", packages=["scopedsites", "scopedsites.migrations"], - version="0.1.5", + version="0.1.6", description="django_scopes x django.contrib.sites", python_requires=">=3.6", install_requires=[