django lazy user实现

代码如下:

from people.service import userQueryService 

class LazyUser(object):
    
    def __get__(self, request, obj_type=None):
        if not hasattr(request, '_cached_user'):
            request._cached_user = self.get_user(request) 
        return request._cached_user
    
    def get_user(self,request):
        print 'request.user_id=%s'%request.user_id
        return userQueryService.findUserById(request.user_id)
    
class UserMiddleware(object):
    def process_request(self, request):
        print 'user session process_request'
        request.user_id = request.session.get('_auth_user_id')
        request.__class__.user = LazyUser()
        return None

这里面的魔法代码是

request.__class__.user

访问到request.user才会触发__get__方法,并返回数据,这是一个demo:

class LazyUser(object):
    def __init__(self,id):
        self.id = id
        
    def __get__(self, request, obj_type=None):
        if not hasattr(request, '_cached_user'):
            request._cached_user = self.get_user(request) 
        return request._cached_user
    
    def get_user(self,request):
        return self.id
    
class Request(object):
    pass

request1 = Request()
request1.__class__.user = LazyUser(1)

print request1.user

request2 = Request() 
request2.__class__.user = LazyUser(2)


print request2.user
print request1.user    

猜你喜欢

转载自san-yun.iteye.com/blog/1855267