为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守着一只汪 2022-06-02 16:21:57
我有一个使用 django 管理界面的应用程序。此应用程序允许用户对其产品执行 CRUD 操作。在这些操作期间,管理 URL 会公开该产品的实际 ID 值,例如https://localhost/product/1/change。我正在寻找一个选项来发送 URL 中显示的混淆 ID 值,例如https://localhost/product/F87BA2/change。有人可以分享您对如何实现这一目标的想法吗?我已经有一个为给定 ID 提供混淆值的函数,但是如何在自动生成的管理 URL 中使用此函数?
查看完整描述

3 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

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



查看完整回答
反对 回复 2022-06-02
?
30秒到达战场

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 可能应该更改标题。


查看完整回答
反对 回复 2022-06-02
?
炎炎设计

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,所以建议使用默认值:


查看完整回答
反对 回复 2022-06-02
  • 3 回答
  • 0 关注
  • 204 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号