2011-05-10 34 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请求期间,与请求相关联的经过身份验证的用户不会更改。

相关问题