3 回答

TA贡献1828条经验 获得超6个赞
尽管我喜欢 Alexander Kononenko 的回答(我不知道 slugfield,感谢您指出这一点),但使用非常简单的方法可能仍然值得:
import base64
partnr='23'
partobf=base64.b32encode((bytes(partnr, 'utf-8'))).decode('utf-8').replace('=', '')
print(partobf)
# reverse it, if you need to deduce a part number from a given URL
partnrb=base64.b32decode('{}{}'.format(partobf, '='*(8-len(partobf)%8))).decode('utf-8')
print(partnrb)
输出:
GIZQ
23
这适用于任何字符串(不仅是数字),而且很容易可逆。除了 Base32,您还可以使用 Base64 或任何其他使用与 URL 兼容的字符的编码。使用此方法,您可以将任何 ID 从明文转换为模糊文本,而无需字典,其中存储了两个值。
但是,重要的是要指出,这些(以及到目前为止线程中存在的其他答案)都与加密无关。因此,OP 可能应该更改标题。

TA贡献1808条经验 获得超4个赞
可能您可以使用UUIDField,它可以用作唯一标识。您可以UUIDField像这样添加模型:
import uuid
class Product(models.Model):
unique_id = models.UUIDField(default=uuid.uuid4, unique=True, editable=False)
并将其与 url 一起使用,如下所示:
# url
path('product/<uuid:unique_id>', views.product, name='product')
# view
def product(request, unique_id):
product = get_object_or_404(Product, unique_id=unique_id)
此外,您可以用UUIDField作主键,因为(来自文档):
通用唯一标识符是用于 primary_key 的 AutoField 的一个很好的替代方案。数据库不会为你生成 UUID,所以建议使用默认值:
添加回答
举报