2011-10-24 143 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,可能會覆蓋您自己的實體。您最好的方法仍然是使用現有的密鑰名稱,而不是試圖混淆它。 –

相關問題