在帐户创建后尝试登录用户时,self.auth.get_user_by_password引发InvalidAuthIdError

时间:2014-02-23 14:43:06

标签: python python-2.7 webapp2

在我的注册用户的处理程序中,我有一些代码如下:

success, info = self.auth.store.user_model.create_user(
                "auth:" + username,
                password_raw = password)
if success:
    self.auth.get_user_by_password("auth:" + username, password)

用户名是在处理程序中从请求的POST参数中获得的。

用户提供有效的用户名(尚未存在的用户名),有效密码,执行此代码并始终生成auth.InvalidAuthIdError()。当我检查数据存储区时,我可以看到已经使用指定的auth id创建了用户。

我花了很多时间对此进行故障排除,其中一个方面非常令人费解。如果我提前知道我将为用户提交注册表单,其用户名等于“someusername”,并将此用户名硬编码为get_user_by_password,如下所示:

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)

一切正常,不会引发任何错误。

编辑:有点不对劲,好像我将代码修改为:

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)

我的反击略高于或低于20.在生产中采用这种方式的方法是什么?我是否应该期望self.auth.store.user_model.create_user()可以返回而不创建在数据存储区中实际完成的用户?我是否应该针对数据存储区的任何put()问题做出此假设?如果有任何人对此有所了解,将不胜感激!谢谢!

编辑:请阅读一下这个,我猜我因为“最终一致的查询”而面临这个问题。我可以从create_user方法返回的信息中获取新用户的密钥,但webapp2似乎没有提供通过数据存储区中的密钥检索用户的方法。

1 个答案:

答案 0 :(得分: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但不确定其他人是否也没有遇到过和我一样的问题。