Django: почему _cached_user является атрибутом экземпляра запроса, а LazyUser является атрибутом класса запроса? - PullRequest
0 голосов
/ 10 мая 2011

В Джанго:

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

Как видите, _cached_user является атрибутом экземпляра request, а LazyUser () является атрибутом класса запроса:

request.__class__.user = LazyUser()

Почему разница? LazyUser в основном просто проверяет, существует ли _cached_user, а если нет, то запрашивает у пользователя session бэкэнд. В этом случае LazyUser и _cached_user не должны быть атрибутом экземпляра request?

1 Ответ

0 голосов
/ 10 мая 2011
request.__class__.user = LazyUser()

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

С другой стороны, _cached_user является внутренней функцией django, это означает, что эта функция используется внутри django и должна быть доступна для любого, кто использует django. Поэтому логично не добавлять это как класс attirbute ... Как сказали разработчики django, атрибуты, начинающиеся с '_', не должны использоваться, поскольку они написаны для использования внутри django, а не для любого приложения, написанного на django.

Кроме того, _cached_user проверяет запрос, и в некоторых случаях данные запроса вошедшего в систему пользователя могут не содержать эту информацию (например, из-за кэша браузера) LazyUser гарантирует возвращать экземпляр пользователя вошедшего в систему пользователя при каждом условии.

И Django предполагает, что аутентифицированный пользователь, связанный с запросом, не изменится во время обработки каждого веб-запроса.

...