2011-11-29 78 views
0

我试图使用应用程序引擎User对象的user_id(由User.user_id()方法返回)作为我自己的User类中的key_name。问题是它一直告诉我这是一个无效的key_name。我试过了,并使用digest()以及hexdigest()方法来减少可能的字符数,但仍然没有好结果。这是因为值太长,或者因为键名不能有某些字符?另外,我如何修改user_id使其保持唯一性,但也可用作实体的key_name?如果它使用散列,那么无法猜测user_id,则额外奖励。适用于app引擎中key_name的规则是什么?

这里就是出错代码:

def get_current_user(): 
    return User.get(db.Key(hashlib.sha1(users.get_current_user().user_id()).hexdigest())) 

我现在做一些更多的测试,concidering从意见和建议答案。

+0

你的用户类中的Key_name是你的User类的PK吗? –

+0

我相信有效的密钥名称包括最多500个字符的任何Unicode字符串。 'user_id()'或一个散列应该是完全有效的。我怀疑你的代码中还有其他的东西。你确定你设定了关键名称,而不是关键? –

+0

在这一点上,我甚至没有设置关键。我试图从一个不存在的数据库中获取用户。我只为自己的用户模块实现了get_current_user方法。我将为它添加代码。 – bigblind

回答

1

我不知道为什么它不适合你,以下在开发控制台中运行时没有问题。

from google.appengine.ext import db 
from google.appengine.api import users 

user = users.get_current_user() 
name = user.user_id() 
print db.Key.from_path ('User', name) 

但是,如果你哈希它(它听起来像你可能),请注意,你可能会发生碰撞。我会避免使用散列,并会考虑其他一些匿名方法,如果你把钥匙给客户。例如另一个模型,您可以放弃其中的钥匙,并将用户钥匙存储在其中。另一种方法是加密id(对所有用户使用相同的密钥),而不是散列它。

如果您正在做一些生成二进制数据(加密/哈希摘要)应用引擎(sdk至少)的问题,那么您需要先对其进行编码,然后将其用作key_name。

name = user.user_id() 

hashed_name = hashlib.sha1(name).digest() 
encoded_name = base64.b64encode (name) 
db.Key.from_path ('User', encoded_name) 
+0

只要散列文本保证是唯一的,而且你没有进行连接,就可以使用散列进行ID。出于所有实际目的,sha2碰撞不会发生。例如,参见[这里](http://stackoverflow.com/questions/4014090/is-it-safe-to-ignore-the-possibility-of-sha-collisions-in-practice)。 –

+0

thx。你正在给的作品。我愚蠢地使用Key构造函数而不是Key.from_path。 – bigblind