2012-05-30 4 views
1

내가 얻을 장고 프로젝트에() request.user.is_authenticated 사용하여 ValidationError: None is not a valid ObjectId은 내가 <code>request.user.is_authenticated()</code>을 할 때

내가 문제를 추적하기 위해 노력하고있어하지만 난 MongoEngine를 사용하여 해난 어떤 원인을하지 않습니다 (그리고 MongoDB를.)

내가 가지고있는 내 settings.py에서 다음

AUTHENTICATION_BACKENDS = (
    'mongoengine.django.auth.MongoEngineBackend', 
    'rs.claimutil.auth_backend.ClaimAuthBackend', 
) 


SESSION_ENGINE = 'mongoengine.django.sessions' 

이 내가 무엇을 얻을 :

추적 기능 : 파일 "/ 라이브러리 /Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 111. 응답 = 콜백 , * callback_args, ** callback_kwargs) 파일 "/Users/bastiano/Documents/ttsf/rsrv/views.py"가 예약어 11. 그렇지 않은 경우 request.user.is_authenticated() : 파일 "/Library/Frameworks/Python.framework /Versions/2.7/lib/python2.7/site-packages/django/utils/functional.py " in 내부 184. self._setup() 파일"/Library/Frameworks/Python.framework/Versions/2.7/lib /python2.7/site-packages/django/utils/functional.py " in _setup 248. self._wrapped = self._setupfunc() 파일"/Library/Frameworks/Python.framework/Versions/2.7/lib/python2 .7/site-packages/dja ngo/contrib/auth/middleware.py " in 16. request.user = SimpleLazyObject (lambda : get_user (request)) 파일 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ site-packages/django/contrib/auth/middleware.py "get_user 의 8. request._cached_user = auth.get_user (요청) 파일"/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/사이트 패키지/장고 /있는 contrib/인증/초기화 평 /Library/Frameworks/Python.framework/Versions/2.7 "나 get_user (101) 사용자 = backend.get_user (USER_ID) 또는 AnonymousUser에서 () 파일" /lib/python2.7/site-packages/mongoengine/django/auth.py "get_user의 149. return User.objec ts.with_id (user_id) 파일 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py"with_id가 인 인 경우 return self.filter (pk = object_id) .first() 파일 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py" 처음에 843. result = self [0] File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py" in getitem 1136. return self._document._from_son (self._cursor [key ]) 파일 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py" in _cursor 579. self._cur sor_obj = self._collection.find (self._query, File "/ 라이브러리 /Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py"_query에서 375. self._mongo_query = self._query_obj.to_query (self._document) 파일 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py"to_query에 202. query = query.accept (QueryCompilerVisitor (document)) 파일 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py" 수신 허용 267 return visitor.visit_query (self) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/queryset.py "visit_query 159. return QuerySet._transform_query (self.document, ** query.query) 파일"/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/ queryset.py " in _transform_query 720. value = field.prepare_query_value (op, value) 파일 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/base. 평 to_mongo 에 /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/base.py " 을"prepare_query_value (455) 반환 self.to_mongo (값)에서 파일 " 451. self.error (unicode (e)) 파일 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mongoengine/base.py"없음 유효한 ObjectId가

어떤 아이디어 을하지 않습니다 : 오류 (203) 인상 ValidationError (메시지, 오류 = 오류, FIELD_NAME = FIELD_NAME)

예외 유형에:/RS/청구 예외 값에 ValidationError 왜 이런 일이 일어 났습니까? Django + MongoDB에서 사용자 인증을 수행하는 더 쉬운 방법이 있습니까?

Views.py는 :

def claim(request): 
    if request.method == 'GET': 
     if not request.user.is_authenticated(): 
      return shortcuts.redirect('rs/login') 
     all_b = dbutil.get_b(all=True) 
     return shortcuts.render_to_response('rs/index.html', 
              {'all_b':all_b}, 
              context_instance=template.RequestContext(request)) 
    elif request.method == 'POST': 

뷰의 나머지 부분은 생략한다. 나는 그것을 디버그하기 위해 ipdb를 사용했고 if not request.user.is_authenticated()이 문제 다. 이전에 django.contrib.auth.decorators.login_required.decorator을 사용해 보았지만 실패했습니다.

+0

귀하의 웹 사이트를 게시하십시오. –

+0

문제는 장고가 내가 만든 인증 백엔드가 아니라'mongoengine.django.auth.MongoEngineBackend '를 사용하고 있다는 것이 었습니다. 비록 내가 settings.py에서 지정 했음에도 불구하고, 저는 제 견해 중 하나에'r_v.obj.backend = 'mongoengine.django.auth.MongoEngineBackend ''라는 줄을 썼습니다. 물론 이것은 Django가 그 인증을 사용하도록 강제합니다 백엔드. @ 로스와 @okm, 감사합니다! – Bastiano9

답변

0

필자의 견해 중 하나는 다음과 같습니다. r_v.obj.backend = 'mongoengine.django.auth.MongoEngineBackend' 이는 장고가 settings.py의 AUTHENTICATION_BACKENDS를 무시하고 사용자 정의 인증 백엔드를 사용하지 않는 이유입니다.

2

mongoengine을 최신 버전으로 업데이트하십시오. In master, 그것은 Noneuseridw/값 트랙백에있어서, 문제가 발생

def get_user(userid): 
    """Returns a User object from an id (User.id). Django's equivalent takes 
    request, but taking an id instead leaves it up to the developer to store 
    the id in any way they want (session, signed cookie, etc.) 
    """ 
    # your installed mongoengine might not include following two lines 
    if not userid: 
     return AnonymousUser() 
    return MongoEngineBackend().get_user(userid) or AnonymousUser() 

이다.

+0

나는 최신 몽고 어레인지를 가지고있다. 나는'get_user (userid)'와'get_user (self, userid)'모두에 대한 추적을 설정했고 실제로는'MongoEngineBackend' 클래스의 일부인 후자를 사용합니다. 나는 장고가 내가 정의한 인증 백엔드를 사용하기로되어 있다고 생각했다. 내 설정에서 MongoEngineBackend를 주석 처리하더라도 Django는 여전히 MongoEngineBackend를 사용합니다. – Bastiano9

+0

@ Bastiano9 사용 된 백엔드 정보가 세션에 저장되므로 'MongoEngineBackend'가 저장된 세션에 영향을 미치지 않습니다.둘째,'get_user (userid)'에서'userid'의 값은 무엇입니까? – okm

+0

나는 db에 저장된 모든 세션을 제거하고 서버를 다시 시작했습니다. 나는 그 문제를 알아 냈다. 내 견해 중 하나에서, 나는 다음을 가졌다 :'r_v.obj.backend = 'mongoengine.django.auth.MongoEngineBackend '', 이는 결코 나의 커스텀 인증 백엔드를 사용하지 않는 이유이다. – Bastiano9

1

어떤 버전의 MongoEngine/Django를 사용하고 있습니까?

django.contrib.auth.middleware.AuthenticationMiddleware을 사용하도록 설정 했습니까? 요청시 User 인스턴스 또는 AnonymousUser으로 설정해야합니다.

rs.claimutil.auth_backend.ClaimAuthBackend의 모습은 무엇입니까? 그리고 그 get_user 메서드는 무엇을 반환합니까? 하나의 인증 백엔드 만 있으면 오류가 발생하지 않습니까?

+0

'django.contrib.auth.middleware.AuthenticationMiddleware'를 활성화 했습니까? - 예. MongoEngine 백엔드를 주석 처리하고'import ipdb; auth_backend.ClaimAuthBackend의'authenticate()'와'get_user()'모두에서 ipdb.set_trace()를 호출하고 Django는이 백엔드를 완전히 건너 뜁니다. – Bastiano9

+0

그래서 Mengoengine을 백엔드로 설치하지 않아도'ClaimAuthBackend'를 건너 뛰었습니까? – Ross

+0

또한 어떤 버전입니까? mongoengine/django – Ross