Некоторые внутренние компоненты промежуточного программного обеспечения Django - PullRequest
4 голосов
/ 20 апреля 2009

В промежуточном программном обеспечении django.contrib.auth Я вижу код:

class AuthenticationMiddleware(object):
    def process_request(self, request):
        assert hasattr(request, 'session'), "requires session middleware"
        request.__class__.user = LazyUser()
        return None

Пожалуйста, скажите мне, почему такая форма request._ class _.user = LazyUser () используемый? Почему не просто request.user = LazyUser ()

Я знаю, что означает атрибут _ class _, но, как я понимаю, прямое назначение переменной экземпляра будет лучше. Где я не прав?

Ответы [ 2 ]

9 голосов
/ 20 апреля 2009

LazyUser - класс дескриптора. Согласно документации это может быть только атрибут класса, а не экземпляр один:

Например, a.x имеет цепочку поиска, которая начинается с a.__dict__['x'], затем type(a).__dict__['x'] и продолжается до базовых классов type(a), исключая метаклассы.

0 голосов
/ 20 апреля 2009

Это повлияет на создание request с. Все такие экземпляры будут иметь свой атрибут user как этот конкретный LazuUser без необходимости вносить это изменение после создания каждого отдельного request.

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