我正在尝试使用应用引擎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()))
我现在正在做更多的测试,从评论和答案中得出结论。
答案 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)