복붙노트

[PYTHON] request.user SimpleLazyObject를 반환합니다, 어떻게 ""나요?

PYTHON

request.user SimpleLazyObject를 반환합니다, 어떻게 ""나요?

나는 다음과 같은 방법을 가지고있다 :

def _attempt(actor):
    if actor.__class__ != User:
        raise TypeError

어떤 관점에서 호출됩니다 :

self.object.attempt(self.request.user)

보시다시피 _attempt 메서드는 액터가 django.contrib.auth.models.User 유형이 될 것으로 예상하지만 객체는 django.utils.functional.SimpleLazyObject 유형으로 나타납니다. 이게 왜 그렇게? 더 중요한 것은 어떻게 LazyObject (User 객체의 래퍼 일종의 것임)를 User 객체로 변환 할 수 있습니까?

Request.user에 대한 자세한 정보는 https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.user에서 볼 수 있습니다.이 문서는 request.user가 사용자 개체 ...

====== 편집 후 =====

나는 지금 다음과 같은 방법을 가지고있다.

def _attempt(obj, action, actor, msg): 
    actor.is_authenticated() 
    if isinstance(actor, LazyObject): 
        print type(actor) 

나는 사용자를 건네 주지만 if 조건은 여전히 ​​참이며 액터는 여전히 LazyObject입니다. 이게 왜 그렇게?

해결법

  1. ==============================

    1.비슷한 질문에 대한 내 대답을 참조하십시오.

    비슷한 질문에 대한 내 대답을 참조하십시오.

    Django는 request.user를로드하여 인증 상태에 따라 User 또는 AnonymousUser가 될 수 있습니다. 그것은 "깨우기"만하고 속성이 액세스 될 때 적절한 클래스를 반환합니다. 불행히도 __class__는 기본 클래스 속성이기 때문에 계산하지 않습니다. 경우에 따라 이것이 실제로 SimpleLazyObject 유형이라는 사실을 알아야 할 수도 있습니다. 따라서 User 또는 AnonymousUser에 프록시를 지정하는 것은 잘못된 것입니다.

    길고 짧게, 당신은 단순히 당신이 그것을 비교할 수 없습니다. 그러나, 당신은 정말로 여기서 무엇을 성취하려고합니까? User 또는 AnonymousUser인지 확인하려는 경우 request.user.is_authenticated ()가 있습니다.

    일반적으로, 오리 입력을 남용해서는 안됩니다. 매개 변수는 필수는 아니지만 항상 특정 유형 또는 하위 유형 (User 또는 UserSubClass)이어야합니다. 그렇지 않으면 혼란스럽고 부서지기 쉬운 코드로 끝납니다.

  2. ==============================

    2.이 작업을 수행해야합니다.

    이 작업을 수행해야합니다.

    # handle django 1.4 pickling bug
    if hasattr(user, '_wrapped') and hasattr(user, '_setup'):
        if user._wrapped.__class__ == object:
            user._setup()
        user = user._wrapped
    

    세션 사전에 사용자를 추가 할 수 있도록이 글을 써야했습니다. SimpleLazyObjects는 picklable이 아닙니다!

  3. ==============================

    3.

    user= request.user._wrapped if hasattr(request.user,'_wrapped') else request.user
    

    그런 다음 request.user 대신 user를 사용합니다.

    이것은 UsAaR33의 대답과 비슷하지만 객체를 변환하는 데는 한 줄짜리가 더 좋습니다.

  4. ==============================

    4.코드에 실패한 "작은"단위 테스트를 작성하려는 사람은 래핑 된 사용자를 생성하여 요청 내에 채울 수 있습니다.

    코드에 실패한 "작은"단위 테스트를 작성하려는 사람은 래핑 된 사용자를 생성하여 요청 내에 채울 수 있습니다.

    from django.contrib.auth import get_user_model
    from django.test import RequestFactory
    from django.utils.functional import SimpleLazyObject
    
    user = get_user_model().objects.create_user(
        username='jacob',
        email='jacob@…',
        password='top_secret',
    )
    
    factory = RequestFactory()
    request = factory.get('/')
    request.user = SimpleLazyObject(lambda: user)
    

    만나다:

  5. from https://stackoverflow.com/questions/11314905/request-user-returns-a-simplelazyobject-how-do-i-wake-it by cc-by-sa and MIT license