`
san_yun
  • 浏览: 2600472 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

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    

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics