Python 对象项的唯一URL生成器或从URL参数隐藏ID

Python 对象项的唯一URL生成器或从URL参数隐藏ID,python,django,python-3.x,Python,Django,Python 3.x,我正在开发一个使用Python3和Django构建的应用程序,它使用数据模型中的填充字段生成PDF(通过HTML)。 我创建了一个URL函数,它接受文档ID和类型的值,然后生成该文档的PDF 我想做的是给客户端发送一个链接,其中包含一个带有特定文档ID的URL函数,然而,我面临的问题是,生成的URL在URL参数中包含文档ID,这对于安全性来说是非常糟糕的,因为他们所能做的就是更改URL上的ID号并访问不同的文档(他们不应该看到) 我的问题是: 有没有办法为我可以发送给客户的每个生成的PDF创建一

我正在开发一个使用Python3和Django构建的应用程序,它使用数据模型中的填充字段生成PDF(通过HTML)。 我创建了一个URL函数,它接受文档ID和类型的值,然后生成该文档的PDF

我想做的是给客户端发送一个链接,其中包含一个带有特定文档ID的URL函数,然而,我面临的问题是,生成的URL在URL参数中包含文档ID,这对于安全性来说是非常糟糕的,因为他们所能做的就是更改URL上的ID号并访问不同的文档(他们不应该看到)

我的问题是:

有没有办法为我可以发送给客户的每个生成的PDF创建一个唯一的链接


B-在随机生成的15个字符的值的模型中创建另一个字段,而不是参数中的ID会更好吗?

我会使用Python 3.6+中提供的新的
secrets
模块。下面是一个示例:

from secrets import token_urlsafe
random_string = token_urlsafe(16)
print(random_string)

结果是这样的-
nslhgo0dYowR6CvMDEwC__A

好的,因此我通过执行以下操作修复了它:

1-UUID就是这样,谢谢@Toan Quoc Ho的建议。我已经在每个模型中添加了一个UUID字段

2-因为我想将我的PK保留为ID,所以我遇到了生成现有文档的唯一UUID字段的问题。因此我遵循了这个方法,它神奇地工作了。唯一需要注意的是,应用这些更改时不能有流量,否则数据库将崩溃,请注意。

然后,我使用UUID和ID来确定文档,并使用regex as(\d+/([\w-]+)将它们作为URL参数传递


瞧,这正是我想要的。没有两个文档共享相同的UUID,反之亦然。我可以为每个文档生成一个唯一的链接,并阻止任何其他访问。

您是否使用django模型中的FileField存储文件?不,文件是在每次访问URL时通过write_pdf()生成的函数哦,所以我认为您可以使用uuid生成一个唯一的id,然后将其用作文件名并发送给您的客户端。我认为这就是我要寻找的!但是我面临一个问题,您可以看到我添加了这个
random\u string\u id=models.UUIDField(默认值=uuid.uuid4,可编辑=False)
添加到我的模型中,但所有文档都有相同的UUID号,这不符合目的。我不能将其用作PK,因为我已经在许多其他地方将ID用作PK。非常感谢您的帮助!@toankochoals值得一提的是,当我添加
unique=True
时,我在数据库中遇到了一个“重复条目”错误