2012-05-11 64 views
4

我想爲我的數據庫對象生成URL。 I've read我不應該使用URL的主鍵,並且存根對於此特定模型不是一個好選擇。根據該鏈接中的建議,我在Python解釋器中使用了zlib.crc32(),並發現這些值通常會返回負值,這些值在我的URL中不需要。有沒有更好的散列,我應該用來生成我的網址?django:如何從數據庫對象的主鍵中散列URL?

更新:我最終使用了David提出的按位異或掩蔽方法,它的工作原理非常奇妙。感謝大家的意見。

+0

不完全是你要求的(因此不是答案),但你可能會考慮slu- - 如果標題和使用。基本上你可以降低/擦除/減少,直到它合法,將它作爲一個字段存儲在對象中(索引!),然後在與之匹配的urls.py中有一個模式。 –

+0

查看[urlauth](http://pypi.python.org/pypi/django-urlauth/0.1.8)應用程序。它不會解決你的需求,但你可以看看它是如何組成URL的,將密鑰保存到數據庫中,並在請求時驗證URL。 – AJJ

+0

@PeterRowell我寧願使用數字值,因爲這些數據可能不會被URL任意訪問。 – raddevon

回答

10

首先,「不要在URL中使用主鍵」只是一個非常薄弱的​​指導方針。 如果您正在使用增量整數ID 您不想公開這些數字,那麼您可以將它們混淆一點。例如,您可以使用:masked_id = entity.id^0xABCDEFABunmasked_id = masked_id^0xABCDEFAB

二,您鏈接的文章爲高度可疑。我不會相信它。首先,CRC32是一種單向散列函數:通常不可能(一般情況下)採用CRC32散列並獲取用於創建該散列的字符串。你會注意到,他沒有告訴你如何查找其pk的CRC32給定的Customer。其次,文章中的代碼甚至沒有意義。 zlib.crc32函數需要一個字節字符串,而Customer.id將是一個整數。

第三,如果你想爲網址使用slug,請小心:如果slug改變,你的URL也會改變。這可能沒問題,但這是你需要考慮的事情。

+0

這是很棒的信息。我會仔細研究一下。謝謝! – raddevon

相關問題