Подтвердить что ты не робот

Доступ к запросу .session из backend.get_user

в первую очередь: это не то же самое, что this. ModelBackend не имеет члена request.

Я хочу получить доступ к сеансу текущего пользователя без доступа к объекту глобального запроса или его идентификатору сеанса.

Почему? Я написал свой собственный сервер аутентификации, расширяя ModelBackend. В этом случае у меня есть функция get_user (self, user_id), которая вызывается с каждым запросом (это делается автоматически с помощью промежуточного ПО Django auth). К сожалению, get_user не имеет доступа к request, но тем не менее в моем случае я хочу проверить данные в сеансе (почему снова? Потому что у меня нет локальной базы данных и получить все данные из удаленного промежуточного программного обеспечения. Сессия была бы удобным способом сделать какое-то кэширование).

4b9b3361

Ответ 1

RemoteUserBackend (из django.contrib.auth.backends) использует специальное промежуточное программное обеспечение, RemoteUserMiddleware, чтобы получить доступ к данным запроса. Может быть, вы тоже это сделаете.

Ответ 2

Вы можете использовать крошечный ThreadLocalMiddleware. Это делает объект запроса повсеместным.

from django_tools.middlewares import ThreadLocal

request = ThreadLocal.get_current_request()
# request.session <-- is now available

Не забудьте добавить промежуточное ПО в корневой каталог MIDDLEWARE_CLASSES ваших настроек .py:

MIDDLEWARE_CLASSES = (
    ...
    'django_tools.middlewares.ThreadLocal.ThreadLocalMiddleware',
    ...
)

Ответ 3

Вы также можете передать параметр "запрос" функции authenticate при каждом ее вызове:

def authenticate(self, request, **kwargs):
    ....