Доступ к 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):
....