2011-05-10 69 views
0

在Django中:Django:爲什麼_Cached_user是請求的實例屬性,而LazyUser是請求的類屬性?

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的屬性嗎?

回答

0
request.__class__.user = LazyUser() 

那是因爲,你可以使用登錄的用戶比如在你的意見和模板,和最好的地方,以保持數據的請求......

在另一方面,_cached_user是django的一個內部函數,也就是說,該函數在django中使用,並且必須是任何使用django的人都可以使用的。因此,不要將它作爲類的屬性添加......正如django開發人員所說的,不能使用以'_'開頭的屬性,因爲在django中使用了寫入的屬性,而不是使用django編寫的任何應用程序。

此外,_cached_user支票請求,並且是某些情況下,請求的數據的登錄的用戶可能不包含信息(例如,因爲瀏覽器高速緩存的)LazyUser保證返回的用戶實例在各種條件下登錄用戶。

並且Django假定在處理每個Web請求期間,與請求相關聯的經過身份驗證的用戶不會更改。