我是Django的新手。昨天晚上,我努力工作,讓我可以編輯當前項目中的任何實體;章節,故事和世界。爲了確保我確切地知道哪個數據庫對象正在被修改,我添加了一個數據庫條目到存儲散列的表的'編輯'中,被編輯的對象的類型(例如,'章節')和那個ID對象在數據庫中找到。散列作爲隱藏輸入添加到表單中。Django的update_object通用視圖是否安全?我應該擴展它還是爲了安全而自己創建?
在後端,表單提交後,我抓取散列並使用它來查找數據庫中相關的Edit項。然後我使用它來查找最初正在編輯哪個對象。這是由於兩個原因:
我可以知道什麼對象是真正被編輯。如果所有表單項目都發生了變化,那麼就沒有什麼可比較的(除了URL)來真正知道正在編輯哪個對象。
用戶應該無法破解前端做奇怪的事情,如修改錯誤的故事。
今天我發現Django有一個通稱爲update_object
的視圖。這似乎爲我處理了很多事情。但考慮到它不會自動使用數據庫來確保正在編輯正確的對象,或者甚至確定正在編輯哪個對象,這是否安全?當然,必須通過修改HTML元素來在前端創建一個簡單的方法。其次,如果這應該是一個問題,你會建議我保留自己的編輯視圖,還是擴展update_object視圖或其他解決方案?
最後,我是否正確地做這件事?如果我沒有以正確的方式考慮解決這個問題,請糾正我。
我不認爲這是一個需要編碼的問題。與Django有關的表單的安全性更像是一個普遍的問題。
感謝,
ParagonRG
謝謝,我沒有注意到那些通用視圖已被棄用!我將不得不亂用UpdateView。另外,有趣的是,我沒有看到隱藏的表單元素,指出哪個對象正在編輯。看看這裏(很短):http://dpaste.com/733945/。這是一個世界對象,它的ID是1.沒有其他可以識別的東西,而且我也沒有看到那個代碼。沒有它,它怎麼會起作用? – Paragon 2012-04-18 21:50:09
@Paragon我想它使用的是URL而不是一個隱藏的ID,這非常相似。碰巧,你可以在這裏看到視圖的來源(https://github.com/django/django/blob/master/django/views/generic/edit.py);如果你追溯到繼承的痕跡,它會在[this method](https://github.com/django/django/blob/master/django/views/generic/detail.py#L19)中找到基於對象的對象在'pk'或'slug'或URL模式中的任何參數上。 – Dougal 2012-04-18 21:56:15
非常有幫助,謝謝。這使我的思想走上正軌。 – Paragon 2012-04-18 22:01:08