import contextlib import logging import threading logger = logging.getLogger(__name__) _local = threading.local() def get_current_user(): return getattr(_local, "user", None) class CurrentUserMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): previous_user = getattr(_local, "user", None) _local.user = request.user try: return self.get_response(request) finally: if previous_user is None: with contextlib.suppress(AttributeError): del _local.user else: _local.user = previous_user