0

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

request.__class__.user = LazyUser()

为什么有区别?LazyUser基本上只是检查是否_cached_user存在,如果不存在,那么它会session为用户查询后端。在那种情况下,两者不应该LazyUser_cached_user实例的属性request吗?

4

1 回答 1

0
request.__class__.user = LazyUser()

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

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

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

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

于 2011-05-10T07:15:11.327 回答