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

Прежде всего: это не то же самое, что это. ModelBackend не имеет request член.

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

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

3 ответа

Решение

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

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

from django_tools.middlewares import ThreadLocal

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

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

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

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

def authenticate(self, request, **kwargs):
    ....
Другие вопросы по тегам