2014-02-23 2 views
2

나는 다음과 같이 코드의 비트를 InvalidAuthIdError를 제기 요청의 POST 매개 변수에서.self.auth.get_user_by_password 사용자를 가입에 대한 내 처리기에서

사용자가 유효한 사용자 이름 (아직 존재하지 않는 사용자 이름), 유효한 암호를 제공합니다.이 코드는 실행되고 항상 auth.InvalidAuthIdError()가됩니다. 데이터 저장소를 검사하면 사용자가 지정된 인증 ID로 생성되었음을 알 수 있습니다.

저는이 문제를 해결하는 데 많은 시간을 할애했으며, 이것에 대한 한 가지 측면이 매우 혼란 스럽습니다. 이 같은 get_user_by_password에 내가 "someusername"동일한 사용자 이름과 사용자의 가입 양식을 작성하여 제출하고이 이름을 하드 코딩 것이라는 점을 미리 알고있는 경우 :

self.auth.get_user_by_password("auth:someusername", password) 
이 제대로 사용자를 기록 할 것으로 보인다

과 InvalidAuthIdError은 '아무튼 제기하지 마라. 이 문제를 계속 해결하는 방법에 대한 단서가 없습니다 ... "auth : someusername"은 "auth :"+ "someusername"과 어떻게 다를 수 있습니까 ??

Traceback (most recent call last): 
    File "/home/radek/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 1536, in __call__ 
    rv = self.handle_exception(request, response, e) 
    File "/home/radek/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 1530, in __call__ 
    rv = self.router.dispatch(request, response) 
    File "/home/radek/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 1278, in default_dispatcher 
    return route.handler_adapter(request, response) 
    File "/home/radek/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 1102, in __call__ 
    return handler.dispatch() 
    File "/home/radek/prasowalnia/main.py", line 44, in dispatch 
    super(BaseHandler, self).dispatch() 
    File "/home/radek/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 572, in dispatch 
    return self.handle_exception(e, self.app.debug) 
    File "/home/radek/google_appengine/lib/webapp2-2.5.1/webapp2.py", line 570, in dispatch 
    return method(*args, **kwargs) 
    File "/home/radek/prasowalnia/main.py", line 199, in post 
    self.auth.get_user_by_password("auth:"+username, password) 
    File "/home/radek/google_appengine/lib/webapp2-2.5.1/webapp2_extras/auth.py", line 459, in get_user_by_password 
    silent=silent) 
    File "/home/radek/google_appengine/lib/webapp2-2.5.1/webapp2_extras/auth.py", line 278, in validate_password 
    return self.get_user_by_auth_password(auth_id, password, silent=silent) 
    File "/home/radek/google_appengine/lib/webapp2-2.5.1/webapp2_extras/auth.py", line 150, in get_user_by_auth_password 
    user = self.user_model.get_by_auth_password(auth_id, password) 
    File "/home/radek/google_appengine/lib/webapp2-2.5.1/webapp2_extras/appengine/auth/models.py", line 298, in get_by_auth_password 
    raise auth.InvalidAuthIdError() 
InvalidAuthIdError 

편집이 :

내가 얻을 역 추적하다이 매우 기괴하지만 난에 코드를 수정하는 경우 :

if success: 
    time.sleep(1) 
    self.auth.get_user_by_password("auth:"+username, password) 

모든 작품, 오류가 발생하지 않습니다. 생산이 접근 할 수있는 방법이 될 것입니다 내가 조금 이상 또는 20 이하 카운터 얻을

if success: 
    counter = 0 
    while True: 
     try: 
      counter += 1 
      self.auth.get_user_by_password("auth:"+username, password) 
     except: 
      continue 
     else: 
      break 
    self.write(counter) 

:

편집 : 나는에 코드를 수정처럼 뭔가 어긋 나서입니까? self.auth.store.user_model.create_user()가 데이터 저장소에서 실제로 완료 한 사용자를 만들지 않고 반환 할 수 있어야합니까? 데이터 저장소에 대해 put()을 실행할 때이 가정을해야합니까? 이것에 대해 밝히는 사람이 있다면 크게 감사하겠습니다! 고맙습니다!

편집 : 이것에 대해 조금 읽으면 "궁극적으로 일관성있는 쿼리"로 인해이 문제에 직면하고 있다고 생각합니다. create_user 메소드가 반환 한 정보에서 새로운 사용자의 키를 얻을 수는 있지만 webapp2는 Datastore의 키를 사용하여 사용자를 검색하는 방법을 제공하지 않는 것 같습니다.

답변

1

다음은 최종 일관성으로 인해 발생하는 문제를 처리해야합니다.

success, info = self.auth.store.user_model.create_user("auth:" + username, 
                 password_raw = password) 
if success: 
    self.auth.set_session(self.auth.store.user_to_dict(info), remember=True) 

ndb를 쿼리하지 않고 사용자에게 로그인해야합니다. webapp2를 처음 접했을 때 어떻게 작동하는지 알 수 있으며 문제가 있으면 여기에 정보가 추가됩니다.

블로그 게시물을 다음과 같이 게시했습니다 : http://gosurob.com/post/20024043690/gaewebapp2accounts 다른 사람이 나와 같은 문제를 경험하지 않은 이유는 무엇입니까?

+0

당신은 혼자가 아닙니다 - 나는 똑같은 문제가있었습니다! (나는 당신이 언급 한 "하드 코드 된 사용자 이름"을 시도하지 않았지만 - 당신처럼 - 나는 get_user_by_password를 사용하여 등록 직후에 로그인을 할 수 없다는 것을 알았다.) 당신의 대답은 내가 필요로하는 것이었다. 감사! – Sam