猿问

如何在 django 管理界面的管理 URL 中发送加密的 id?

我有一个使用 django 管理界面的应用程序。此应用程序允许用户对其产品执行 CRUD 操作。在这些操作期间,管理 URL 会公开该产品的实际 ID 值,例如https://localhost/product/1/change。我正在寻找一个选项来发送 URL 中显示的混淆 ID 值,例如https://localhost/product/F87BA2/change。有人可以分享您对如何实现这一目标的想法吗?

我已经有一个为给定 ID 提供混淆值的函数,但是如何在自动生成的管理 URL 中使用此函数?


守着一只汪
浏览 205回答 3
3回答

海绵宝宝撒

可能您需要 slug 字段:https ://docs.djangoproject.com/en/2.2/ref/models/fields/#slugfield 它完全符合您的要求。

30秒到达战场

尽管我喜欢 Alexander Kononenko 的回答(我不知道 slugfield,感谢您指出这一点),但使用非常简单的方法可能仍然值得:import base64partnr='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 URLpartnrb=base64.b32decode('{}{}'.format(partobf, '='*(8-len(partobf)%8))).decode('utf-8')    print(partnrb)输出:GIZQ23这适用于任何字符串(不仅是数字),而且很容易可逆。除了 Base32,您还可以使用 Base64 或任何其他使用与 URL 兼容的字符的编码。使用此方法,您可以将任何 ID 从明文转换为模糊文本,而无需字典,其中存储了两个值。但是,重要的是要指出,这些(以及到目前为止线程中存在的其他答案)都与加密无关。因此,OP 可能应该更改标题。

炎炎设计

可能您可以使用UUIDField,它可以用作唯一标识。您可以UUIDField像这样添加模型:import uuidclass Product(models.Model):&nbsp; &nbsp; unique_id = models.UUIDField(default=uuid.uuid4, unique=True, editable=False)并将其与 url 一起使用,如下所示:# urlpath('product/<uuid:unique_id>', views.product, name='product')# viewdef product(request, unique_id):&nbsp; &nbsp; &nbsp;product = get_object_or_404(Product, unique_id=unique_id)此外,您可以用UUIDField作主键,因为(来自文档):通用唯一标识符是用于 primary_key 的 AutoField 的一个很好的替代方案。数据库不会为你生成 UUID,所以建议使用默认值:
随时随地看视频慕课网APP

相关分类

Python
我要回答