[PYTHON] request.user SimpleLazyObject를 반환합니다, 어떻게 ""나요?
PYTHONrequest.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.비슷한 질문에 대한 내 대답을 참조하십시오.
비슷한 질문에 대한 내 대답을 참조하십시오.
Django는 request.user를로드하여 인증 상태에 따라 User 또는 AnonymousUser가 될 수 있습니다. 그것은 "깨우기"만하고 속성이 액세스 될 때 적절한 클래스를 반환합니다. 불행히도 __class__는 기본 클래스 속성이기 때문에 계산하지 않습니다. 경우에 따라 이것이 실제로 SimpleLazyObject 유형이라는 사실을 알아야 할 수도 있습니다. 따라서 User 또는 AnonymousUser에 프록시를 지정하는 것은 잘못된 것입니다.
길고 짧게, 당신은 단순히 당신이 그것을 비교할 수 없습니다. 그러나, 당신은 정말로 여기서 무엇을 성취하려고합니까? User 또는 AnonymousUser인지 확인하려는 경우 request.user.is_authenticated ()가 있습니다.
일반적으로, 오리 입력을 남용해서는 안됩니다. 매개 변수는 필수는 아니지만 항상 특정 유형 또는 하위 유형 (User 또는 UserSubClass)이어야합니다. 그렇지 않으면 혼란스럽고 부서지기 쉬운 코드로 끝납니다.
-
==============================
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.
user= request.user._wrapped if hasattr(request.user,'_wrapped') else request.user
그런 다음 request.user 대신 user를 사용합니다.
이것은 UsAaR33의 대답과 비슷하지만 객체를 변환하는 데는 한 줄짜리가 더 좋습니다.
-
==============================
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)
만나다:
from https://stackoverflow.com/questions/11314905/request-user-returns-a-simplelazyobject-how-do-i-wake-it by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬에서 함수를 중첩 할 때 오버 헤드가 있습니까? (0) | 2018.11.04 |
---|---|
[PYTHON] 자동 테스트 세트에 대해 setUp을 한 번만 실행하십시오. (0) | 2018.11.04 |
[PYTHON] 함수의 모든 인수를 다른 함수에 전달 (0) | 2018.11.04 |
[PYTHON] 팬더 데이터 프레임에 상수 값이있는 열 추가 (0) | 2018.11.04 |
[PYTHON] 문자열 목록의 요소에서 후행 줄 바꾸기 (0) | 2018.11.04 |