Как работает код Django LazyUser? - PullRequest
2 голосов
/ 13 апреля 2011

Мне любопытно, как на самом деле работает этот код.В частности, что делает request.__class__.user = LazyUser() в отличие от setattr(request, user, LazyUser()).Извините, если это неосведомленный вопрос, я хочу знать, потому что я собираюсь реализовать подобную часть промежуточного программного обеспечения, которая добавляет атрибут к запросу.

Вот код и, конечно, когда вы вызываете request.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 middleware requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'."
        request.__class__.user = LazyUser()
        return None

Обновление: Читая немного, я понимаю, как работает бит __get__, поэтому мой вопрос сводится к тому, почемусделайте это против использования setattr(), как я упоминал выше.Почему стоит добавить user как свойство объекта против экземпляра?

Ответы [ 2 ]

3 голосов
/ 13 апреля 2011

В этом случае, так как LazyUser () является классом, который выясняет, проверял ли объект запроса, чтобы убедиться, что пользователь был запрошен, это настоящая магия, ему нужно только запросить базу данных для пользователя. один раз за сессию. Будучи свойством, это универсальное действие, которое будет применяться ко всем экземплярам запроса. Свойства одинаковы для всех экземпляров указанного объекта. Это просто делает пользовательское свойство экземпляром LazyUser, позволяя только одному его экземпляру в памяти (в этой части, кто-то другой должен прояснить этот момент).

0 голосов
/ 13 апреля 2011

Почему хорошая идея добавить пользователя как свойство объекта против экземпляра?

Это необходимо, поэтому метод __get__ вызывается через протокол дескриптора. Смотри здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...