你能解释一下“django.contrib.auth”对我有用吗?

时间:2011-05-06 02:16:10

标签: django

我正在开发一个验证模块,从“django.contrib.auth”中获取灵感并取而代之。

他们正在做什么以及为什么?

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
  • 是否在每次请求时都试图阻止用户实例的数据库命中?
  • 如果用户记录被更改,是否会过时?
  • 为什么他们不在会话中直接保存用户实例或密钥?
  • 为什么要分配到request.__class__.user而不仅仅是request.user

我会添加身份验证,登录和注销例程,但不想让你厌烦太多的代码转储。我想我现在明白了,(最后一个问题可能是关键)但只是强迫自己(在某种程度上)明智地提出问题: - )

1 个答案:

答案 0 :(得分:4)

  1. 否。它每次请求最多拉一次用户,但不会跨越请求。
  2. 他们这样做。存储PK。
  3. 因此它成为request的类属性(与实例属性相对),这使其可以作为descriptor正常工作。