我有幾個模型需要生成唯一的令牌,以便我可以使用「祕密」URL訪問它們。現在,我這樣做,通過在每個模型創建一個「令牌」字段,並使用uuid
模型的save
方法填充,這樣的:爲模型快速生成唯一的靜態令牌
self.token = uuid.uuid4().hex
while Notification.objects.filter(token=self.token).exists():
self.token = uuid.uuid4().hex
在這個作品中,明顯的缺點是:(1)I每個Notification
條目需要有一個token
字段,更重要的是,(2)每次創建新模型時,這至少會查詢一次數據庫。儘管uuid4()不太可能產生重複的令牌,但任何嚴重的應用程序仍然需要進行檢查。
是否有更好的方法可以讓我產生一個隨機的唯一令牌,或許可以從模型的ID派生,我可以保證是獨一無二的,但仍然是不可預測的/可猜測到攻擊,而無需進行查詢,以確保它是獨一無二的?
我有同樣的問題,我在做同樣的事情,除了我使用'從django.utils導入加密,crypto.get_random_string(field_length)''。我看不出如何隨意創建一些東西,並且知道不經過檢查就不會重複。 – SColvin