在我的注册用户的处理程序中,我有一些代码如下:
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似乎没有提供通过数据存储区中的密钥检索用户的方法。
答案 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但不确定其他人是否也没有遇到过和我一样的问题。