#django
#django
Вопрос:
Я работаю над модулем аутентификации, вдохновляясь и заменяя «django.contrib.auth».
Что они делают со всем этим и почему?
def get_user(request):
from django.contrib.auth.models import AnonymousUser
try:
user_id = request.session[SESSION_KEY]
backend_path = request.session[BACKEND_SESSION_KEY]
backend = load_backend(backend_path)
user = backend.get_user(user_id) or AnonymousUser()
except KeyError:
user = AnonymousUser()
return user
class LazyUser(object):
def __get__(self, request, obj_type=None):
if not hasattr(request, '_cached_user'):
from django.contrib.auth import get_user
request._cached_user = get_user(request)
return request._cached_user
class AuthenticationMiddleware(object):
def process_request(self, request):
assert hasattr(request, 'session'), "The Django authentication ..."
request.__class__.user = LazyUser()
return None
- Пытается ли это предотвратить попадание в базу данных для экземпляра пользователя при каждом запросе?
- Устаревает ли он, если пользовательская запись изменена?
- Почему они просто не сохраняют экземпляр пользователя или ключ к нему в сеансе?
- почему присваивать
request.__class__.user
, а не простоrequest.user
?
Я бы добавил процедуры аутентификации, входа и выхода из системы, но не хочу утомлять вас слишком большим количеством дампов кода. Я думаю, что теперь я понял (этот последний вопрос может быть ключевым), но только заставив себя изложить вопрос (несколько) разумно 🙂
Ответ №1:
- Нет. Он запрашивает пользователя не более одного раза за запрос, но не охватывает запросы.
- ДА.
- Они работают. Сохранить PK.
- Чтобы он стал атрибутом класса
request
(в отличие от атрибута экземпляра), что позволяет ему корректно работать как дескриптор.
Комментарии:
1. Почему в сеанс помещается только ключ, а не весь пользовательский объект?
2. Потому что поместить весь объект в сеанс непросто, плюс (хотя это случается очень, очень редко) весь класс, используемый для пользователя, может измениться под ним, что приведет к странным ошибкам.
3. Я думаю, что это также из-за проблем безопасности, связанных с сеансом.
4. Как так? PK — это все, что нужно для идентификации пользователя.
5. Во-первых, это не случайное хэш-значение, которое вводится в сеанс, а не первичный ключ. Кто-то может захватить или подделать (cookie-подделка) информацию в вашем сеансе, что может вызвать потенциальную проблему.