Мне любопытно, как на самом деле работает этот код.В частности, что делает 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
как свойство объекта против экземпляра?