2011-04-13 6 views
2

이 코드가 실제로 어떻게 작동하는지 궁금합니다. 특히 setattr(request, user, LazyUser())과 반대로 request.__class__.user = LazyUser()의 기능은 무엇입니까? 죄송합니다. 무지한 질문이라면 요청에 속성을 추가하는 유사한 미들웨어 조각을 구현할 것이기 때문에 알고 싶습니다.Django LazyUser 코드는 어떻게 작동합니까?

코드는 다음과 같습니다. request.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 middleware requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'." 
     request.__class__.user = LazyUser() 
     return None 

업데이트 : 약간의 독서를하는, 나는 __get__ 비트 그래서 제 질문은 제가 위에서 언급 한 바와 같이 setattr()를 사용하여이 대를 할 이유를 아래로 비등, 어떻게 작동하는지 이해합니다. user을 개체의 속성으로 인스턴스를 추가하는 것이 좋은 아이디어 인 이유는 무엇입니까?

답변

2

이 경우 LazyUser()는 요청 객체가 이미 사용자를 쿼리했는지 확인하기 위해 검사했는지를 확인하는 클래스이기 때문에 이것은 실제 마법이며 데이터베이스에 대한 쿼리 만 필요합니다. 세션 당 한 번 사용자. 재산이므로 모든 요청에 ​​적용되는 보편적 인 조치입니다. 속성은 상기 객체의 모든 인스턴스에서 동일합니다. 이것은 단순히 사용자 속성을 LazyUser의 인스턴스로 만들어서 메모리에 하나의 인스턴스 만 허용합니다 (이 부분은 iirc, 다른 부분은이 지점을 명확히 할 수 있어야합니다).

0

사용자를 개체의 속성으로 추가하는 것이 좋은 이유는 무엇입니까?

__get__ 메서드가 설명자 프로토콜을 통해 호출되어야합니다. here을 참조하십시오.

관련 문제