【问题标题】:what are the rules that apply on the key_name in app engine?应用引擎中的 key_name 有哪些规则?
【发布时间】:2011-11-29 22:48:58
【问题描述】:

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

这是发生错误的代码:

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

我现在正在做更多的测试,考虑来自 cmets 的建议和答案。

【问题讨论】:

  • 你的用户类中的Key_name是你的用户类的PK吗?
  • 我相信有效的键名包括最多 500 个字符的任何 Unicode 字符串。 user_id() 或哈希当然应该是完全有效的。我怀疑您的代码中还有其他问题。您确定要设置密钥名称,而不是密钥本身吗?
  • 此时,我什至没有设置密钥。我正在尝试从不存在的数据库中获取用户。我只是为我自己的用户模块实现 get_current_user 方法。我会将它的代码添加到问题中。
  • 请注意,如果您包含错误的堆栈跟踪,而不是对其进行解释,那么问题所在会立即显而易见。

标签: google-app-engine entity key


【解决方案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)

【讨论】:

  • 对 ID 使用哈希是完全可以的,只要保证哈希文本是唯一的并且您没有进行连接。出于所有实际目的,不会发生 sha2 冲突。例如,请参阅here
  • 谢谢。你给出的例子是有效的。我愚蠢地使用 Key 构造函数而不是 Key.from_path。
猜你喜欢
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多