2011-10-24 28 views
1

除了我生成的key_name之外,我还希望拥有其他一些属性,这些属性将作为id(我不想向用户显示key_name)。它可以是id?或者,如何生成唯一的值而不是id有没有办法让GAE数据存储实体同时拥有key_name和id?

我会做什么 - 我将生成一个使用该ID和父键名称的URL。如果用户点击这个链接,我需要找到这个数据存储实体并更新它。

这是当前的代码。

创造的纪录:

item = Items.get_by_key_name(key_names=user_id, parent=person) 
    if item is None: 
    item = Items(key_name='id'+user_id, parent=person) 

获取记录:

item = Items.get_by_key_name(key_names=user_id, parent=person) 

user_id是什么应该被隐藏。

+0

你不能直接使用base64编码密钥吗? – systempuntoout

+0

@systempuntoout,但没有保持在数据存储?之后需要根据数据存储实体标识这个ID的用法。 –

+0

是的,只是直接使用密钥(base64编码),而不是key_name – systempuntoout

回答

3

我可能是可能是错误的,因为你的要求不明确,但对我来说,你应该使用经过刚才的关键观点:

item.key() 

,那么你可以在关键传回给控制器,并方便地检索一个给定的实体:

item = Items.get(key) 
+0

我可以在URL中使用这个key()值吗? –

+0

是的,它是安全的,Gae使用修改后的Base64来完成此目的。 – systempuntoout

+0

难道我不能解码Base64以取回原始用户名吗?这似乎不是很安全。或者你还在计划使用md5做些什么? –

3

实体只有一个密钥名称或ID - 从来都没有。你可以用一个ReferenceProperty创建一个指向你的目标实体的实体,并使用它的ID作为标识符,但实际上应该没有理由不向用户透露一个键名 - 一个良好编写的应用程序不应该依赖这个值保持秘密。

请注意,从字符串编码密钥中提取密钥名称(以及有关密钥的其他信息)非常容易。

+0

尼克,如果不是'key_name ='id'+ user_id',我会用于例如'key_name ='constant'+ md5('id'+ user_id +'''+ parent.key()。name ))。hexdigest()'? –

+0

我可以自己定义'id'吗(它会是数字)?或者,我应该使用'key_name'吗? –

+0

@LA_是的,你可以这么做,但是这样做还是没有意义的(甚至在包含父键名的时候也没有意义)。您可以定义自己的ID,但是如果您忘记了这一点,则会使用自动生成的ID,可能会覆盖您自己的实体。您最好的方法仍然是使用现有的密钥名称,而不是试图混淆它。 –

相关问题