Использование threading.local() в контейнере kubernetes

В моем приложении есть промежуточное ПО, которое устанавливает текущего зарегистрированного пользователя. На моей локальной машине функция get_current_user() работает нормально, но при запуске приложения в контейнере kubernetes она, похоже, возвращает None. Что я упускаю?:

USER_ATTR_NAME = getattr(settings, "LOCAL_USER_ATTR_NAME", "_current_user")

_thread_locals = local()


def _do_set_current_user(user_fun):
    setattr(_thread_locals, USER_ATTR_NAME, user_fun.__get__(user_fun, local))


def _set_current_user(user=None):
    """
    Sets current user in local thread.
    Can be used as a hook e.g. for shell jobs (when request object is not
    available).
    """
    _do_set_current_user(lambda self: user)


class SelfServeCurrentUserMiddleware(object):

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # request.user closure; asserts laziness;
        # memorization is implemented in
        # request.user (non-data descriptor)
        _do_set_current_user(lambda self: getattr(request, "user", None))
        response = self.get_response(request)
        return response


def get_current_user():
    current_user = getattr(_thread_locals, USER_ATTR_NAME, None)
    if callable(current_user):
        return current_user()
    return current_user


def get_current_authenticated_user():
    current_user = get_current_user()
    if isinstance(current_user, AnonymousUser):
        return None
    return current_user

Все, что вы делаете, показывает мне - вы не понимаете, как работает Django.

Что я имею в виду: Вам нужна модель пользователя, где-то, возможно это форма. Вы не понимаете, как получить пользователя там, и пытаетесь использовать локали. Вы сделали импорт функций get_current_user, get_current_authenticated_user. Теперь вы можете получить пользователя. Это неправильно для Django, но вы можете это сделать.

У меня есть для вас небольшая хитрость на этот случай:

from django.utils.translation.trans_real import _active as _thread_locals

# _thread_locals = local() you don't need it.

... # other staff

это то, что вам нужно. Смотрите комментарий о _active в коде django

Вернуться на верх