2014-10-28 70 views
2

使用webapp2时,创建新用户时,只需使用auth_id设置一个简单的entity.put(),而不需要设置自定义实体键。但是,如果您尝试通过授权令牌来检索用户,它会假定(Kind,auth_id)的实体由于其密钥设置为(Kind,id)而变为空。我错过了什么吗?为什么get_by_auth_token中假定的密钥是Kind,auth_id? create_user做到这一点:使用错误实体键的Webapp2 get_by_auth_token

ok, existing = cls.unique_model.create_multi(k for k, v in uniques) 
    if ok: 
    user.put() 

但get_by_auth_token做到这一点:

token_key = cls.token_model.get_key(user_id, 'auth', token) 
user_key = model.Key(cls, user_id) 
valid_token, user = model.get_multi([token_key, user_key]) 

http://webapp-improved.appspot.com/_modules/webapp2_extras/appengine/auth/models.html#User.get_by_auth_token

好像这是没有得到太多的活动,但是为了以防万一有人碰到这个错误运行。

create_user未设置默认设置ID的密钥。我扩展了用户模型并覆盖了create_user类方法,以将实体关键字设置为auth_id。您需要重写add_auth_id以将密钥更新为新的auth_id。

user_values['auth_ids'] = [auth_id] 
    user_key = model.Key(cls, auth_id) 
    user = cls(key=user_key, **user_values) 
+0

如果可以的话,我会赞成这两次,感谢您提出问题并找到答案。这已经破坏了我的头!!!!!!有没有机会分享一些更多的create_user方法,以便我知道要在我的内容中包含哪些内容? – ColinMasters 2014-12-02 16:33:15

回答

0

由于帕拉姆命名'user_id'代替'auth_id',我认为这是设计上的目的。它建议你使用自动生成的id作为令牌的一部分。

这种设计的好处是,简单的model.Key(cls, id)可能会更快,并且它不包含令牌内的任何敏感信息(例如用户电子邮件)。

所以,在create_auth_token(user_id)get_by_auth_token(user_id),通过user_id = user.key.id()可能是一个不太冒险的方式。