代码如下:
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_userdef get_user(self,request):print 'request.user_id=%s'%request.user_idreturn 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 = iddef __get__(self, request, obj_type=None):if not hasattr(request, '_cached_user'):request._cached_user = self.get_user(request) return request._cached_userdef get_user(self,request):return self.idclass Request(object):passrequest1 = Request()
request1.__class__.user = LazyUser(1)print request1.userrequest2 = Request()
request2.__class__.user = LazyUser(2)print request2.user
print request1.user