2011-05-06 86 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

相關問題