适用于app引擎中key_name的规则是什么?

时间:2011-11-29 22:48:59

标签: google-app-engine entity key

我正在尝试使用应用引擎User对象的user_id(由User.user_id()方法返回)作为我自己的User类中的key_name。问题是它一直告诉我它是一个无效的key_name。我试过sha2'ing它,并使用digest()以及hexdigest()方法来减少可能的字符数,但仍然没有好结果。这是因为值太长,还是因为键名不能包含某些字符?而且,我如何修改user_id使其保持唯一,但也可用作实体的key_name?如果它使用哈希值,那么额外的奖励就是不能猜到用户名。

以下是发生错误的代码:

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

我现在正在做更多的测试,从评论和答案中得出结论。

1 个答案:

答案 0 :(得分: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)
相关问题