【问题标题】:django: How do I hash a URL from the database object's primary key?django:如何从数据库对象的主键中散列 URL?
【发布时间】:2012-05-20 13:21:16
【问题描述】:

我正在尝试为我的数据库对象生成 URL。 I've read 我不应该对 URL 使用主键,对于这个特定的模型来说,存根不是一个好的选择。根据该链接中的建议,我在 Python 解释器中使用 zlib.crc32() 并发现值通常返回负数,这是我不希望在我的 URL 中出现的。我应该使用更好的哈希来生成我的网址吗?

更新:我最终使用了 David 下面建议的按位 XOR 掩码方法,效果非常好。感谢大家的意见。

【问题讨论】:

  • 不完全符合您的要求(因此不是答案),但您可以考虑对标题进行 slug-ifying 并使用它。基本上你降低/擦洗/减少直到它是合法的,将它作为一个字段存储在对象中(索引!),然后在 urls.py 中有一个匹配它的模式。
  • 查看urlauth 应用程序。它不能满足您的需求,但您可以看看它如何构成 URL、将密钥保存到 DB 并在请求时验证 URL。
  • @PeterRowell 我更喜欢使用数值,因为这些可能不会被 URL 任意访问。

标签: python django design-patterns url hash


【解决方案1】:

首先,“不要在 URL 中使用主键”只是一个非常薄弱的​​准则。 如果您正在使用增量整数 ID并且您不想透露这些数字,那么您可以稍微混淆一下它们。例如,您可以使用:masked_id = entity.id ^ 0xABCDEFABunmasked_id = masked_id ^ 0xABCDEFAB

其次,您链接到的文章高度可疑。我不会相信它。首先,CRC32 是一种单向散列函数:(通常)不可能获取 CRC32 散列并取回用于创建该散列的字符串。您会注意到,鉴于他们的pk 的CRC32,他没有向您展示如何查找Customer。其次,文章中的代码甚至没有意义。 zlib.crc32 函数需要一个字节字符串,而 Customer.id 将是一个整数。

第三,如果你想为 URL 使用 slug 时要小心:如果 slug 改变,你的 URL 也会改变。这可能没问题,但这是您需要考虑的事情。

【讨论】:

  • ^ 0xABCDEFAB 是一个不错的解决方案。对于任何不确定它在做什么的人,这就是按位 XOR 运算符。
猜你喜欢
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 2013-05-23
相关资源
最近更新 更多