Ответ 1
RemoteUserBackend
(из django.contrib.auth.backends
) использует специальное промежуточное программное обеспечение, RemoteUserMiddleware
, чтобы получить доступ к данным запроса. Может быть, вы тоже это сделаете.
в первую очередь: это не то же самое, что this. ModelBackend не имеет члена request
.
Я хочу получить доступ к сеансу текущего пользователя без доступа к объекту глобального запроса или его идентификатору сеанса.
Почему? Я написал свой собственный сервер аутентификации, расширяя ModelBackend
. В этом случае у меня есть функция get_user (self, user_id)
, которая вызывается с каждым запросом (это делается автоматически с помощью промежуточного ПО Django auth). К сожалению, get_user
не имеет доступа к request
, но тем не менее в моем случае я хочу проверить данные в сеансе (почему снова? Потому что у меня нет локальной базы данных и получить все данные из удаленного промежуточного программного обеспечения. Сессия была бы удобным способом сделать какое-то кэширование).
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 ваших настроек .py:
MIDDLEWARE_CLASSES = (
...
'django_tools.middlewares.ThreadLocal.ThreadLocalMiddleware',
...
)
Вы также можете передать параметр "запрос" функции authenticate
при каждом ее вызове:
def authenticate(self, request, **kwargs):
....