2011-05-06 53 views
0

我正在从“django.contrib.auth”中抽取灵感并从中取回验证模块。你能解释一下“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

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

回答

4
  1. 不,它最多一次拉出用户一次请求,但不包括请求。
  2. 是的。
  3. 他们这样做。店里的PK。
  4. 以便它成为request(与实例属性相对)的类属性,从而使其能够正确工作为descriptor
+0

为什么只把键放在会话中而不是整个用户对象? – 2011-05-06 03:38:04

+0

因为在会话中放置整个对象并不简单,加上(虽然这很少发生),但用户可以使用整个类改变它,导致奇怪的错误。 – 2011-05-06 03:41:08

+0

我认为这也是因为会话相关的安全问题。 – solartic 2011-05-06 04:17:31

相关问题