【问题标题】:Django: why is _cached_user an instance attribute of request while LazyUser is a class attribute of request?Django:为什么 _cached_user 是请求的实例属性,而 LazyUser 是请求的类属性?
【发布时间】:2011-08-22 03:45:44
【问题描述】:

在 Django 中:

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_userrequest 实例的属性,而 LazyUser() 是请求类的属性:

request.__class__.user = LazyUser()

为什么不一样? LazyUser 基本上只是检查_cached_user 是否存在,如果不存在则为用户查询session 后端。在那种情况下,LazyUser_cached_user 不应该都是实例 request 的属性吗?

【问题讨论】:

    标签: django django-authentication django-sessions


    【解决方案1】:
    request.__class__.user = LazyUser()
    

    这是因为,您可以在视图和模板中使用已登录的用户实例,而保存该数据的最佳位置是请求...

    另一方面,_cached_user 是 django 的内部函数,也就是说,该函数在 django 内部使用,任何使用 django 的人都必须避免使用该函数。因此,不将其添加为类属性是合乎逻辑的......正如 django 开发人员所说,不能使用以 '_' 开头的属性,因为在 django 中写入使用,而不是在 django 中编写的任何应用程序。

    另外,_cached_user检查请求,在某些情况下,登录用户的请求数据可能不包含该信息(例如由于浏览器缓存)LazyUser 保证在每种情况下都返回登录用户的用户实例。

    并且 Django 假设与请求关联的经过身份验证的用户在处理每个 Web 请求期间不会更改。

    【讨论】:

      猜你喜欢
      • 2015-08-08
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      相关资源
      最近更新 更多