2016-05-13 64 views
1

我正在創建一個應用程序,我希望通過哈希字符串訪問圖片(以防止人們猜測/訪問其他照片)。爲此,我使用以下方法:何時生成django模型ID?

class PhotoModel(models.Model): 
    name = models.CharField(max_length=256) 
    slg = models.SlugField() 

    def save(self, *args, **kwargs): 
     if not self.slg: 
      self.slg = slugify(my_own_hash_function(str(self.id))) 
     super(PhotoModel, self).save(*args, **kwargs) 

該方法正在工作,但我找不出原因。當在Django模型'ID'生成?這是爲對象創建一個不可猜測的url的正確方法嗎? (爲了增加安全性,我會在後面添加一個salt)

回答

0

如果id字段是自動增量字段,則ID實際上是由數據庫生成的。它通過數據庫中的可用機制返回到django,例如在mysql中,這可能是LAST_INSERT_ID()

如果在模型中重寫保存方法,那麼在執行super(PhotoModel, self).save(*args, **kwargs)之前,該ID將是未定義的,但它將在之後定義。

另一種生成ID的方法是使用UUID字段。在這種情況下產生的Django與呼叫ID,以uuid.uuid4

UUID字段是不可猜測,如果你有一個UUID字段作爲主鍵,你就不需要你塞領域,但也有使用UUID的其他缺點。 UUID的優點和缺點在stackoverflow的其他地方被廣泛討論,我認爲我不需要進一步討論。

至於問題「這是正確的方式來創建一個對象的不可猜測的網址?」如果不查看您的散列函數,則無法正確回答此問題。無論如何,這真的應該在一個單獨的問題上發佈。

+0

我和你現在提到的有相同的理解(關於'id'),但是上面的代碼起作用,save函數在我第一次調用save的時候被調用。例如: 'a = PhotoModel()' 'a.save()' 'save'將會失敗,因爲所需字段不存在且'id'變爲空,對象也不會持久保存到數據庫。但是slg字段已經填充了! – sudshekhar

+0

您的模型與您發佈的完全相同嗎?因爲這種行爲絕對是我提到的,我覺得django框架的這一部分不太可能是bug。 – e4c5

+0

好吧,現在我覺得自己像個白癡:P。我的模型和我上面描述的一樣,但是我的散列函數是造成這種混淆的原因。行爲的工作原理與我所描述的一樣,只是因爲我的哈希函數使用'None'生成了一個slug,因此我看到了正在生成的值。通過在函數內添加一個簡單的打印語句來找到這一點。對困惑感到抱歉! – sudshekhar