2017-03-14 40 views
0

這些Django REST Framework序列化程序肯定會令人費解。Django REST Framework序列化程序:可讀和有點可寫

我有一種情況,我已經解決了,但仍然想知道如果我拔掉的解決方案真的是最順利的。

我在我的數據庫中有一些產品信息。像往常一樣,產品使用產品ID進行引用。我當然希望產品ID是可讀的,所以我實現ModelSerializer有

read_only_fields = ('id',) 

這些ID和其他產品信息,然後爲JSON傳遞到前端。我不想要發生的事情是,互聯網上的未知人員能夠向我發送任意產品ID和其他信息,並將這些信息存入我的數據庫,這就是爲什麼我將該字段設置爲read_only_field。

但是,我確實希望能夠從前端接收有效的現有產品數據並將其反序列化爲Python對象。由於ID字段是read_only_field,因此DRF將忽略它,並且ID永遠不會被反序列化。所以我想我也想讓這些序列化器也是可寫的。只是不太可寫。

我現在所做的是我做了一箇中間的ProductSerializer,它是可讀可寫的,並且永遠不會直接保存到數據庫。

或者我應該保留原始的ModelSerializer可讀寫,但是覆蓋.is_valid()來檢查我們是否正在處理現有的產品ID?

還是有其他方式可以解決這個困境嗎?

edit0:

所以我想做到,是一樣的東西下列步驟操作:

  1. 通過dropzone.js

  2. 接收圖像上傳分析圖像,確認這是一個正確的一個,如果是,則根據圖像屬性發迴帶有產品推薦數組的JSON響應。此時,產品數據應該從數據庫序列化。

  3. 用戶選擇數量和whatnot,然後將此產品信息發回。在這裏,我使用PUT到當前稱爲「/籃子」的端點。

  4. 將此信息反序列化回產品對象並構建各種購物車。這是我注意到問題的地方。惡意用戶可能會發送任意信息,所以我想確保這些虛假信息不被接受,並且只有真正在數據庫中的產品才能被處理。

回答

1

正如我所看到的,這是一個有點不同的問題。您唯一應該關心的是確保所有寫入請求都需要授權。不應該允許任何人將任何東西放入數據庫,但對於擁有適當權限的用戶而言。雖然那些有他們的人被認爲是可信的用戶,你不應該擔心他們可以發佈不好的東西給你的數據庫。

DRF包括令牌認證,會話認證和其他auth methods,您可以使用Permissions。您必須必須使權限系統保護所有POST,PUT和DELETE請求,否則您的API非常脆弱。

如果我正確記得它,默認情況下,ModelSerializer上的主鍵是隻讀的。

+0

如果允許發佈從unauthed用戶的圖像,而無需節制和限制你在與提交的機器人,這將佔據整個存儲空間的假圖像得到刷新結束了的風險。 **所有**寫入請求應受權限保護。 更重要的是,如果你只需要上傳圖片,這與公開產品表完全無關。您可以公開圖像上傳端點API並將每個圖像與後端產品相關聯。您的未經授權的用戶不應該POST和PUT到產品端點。 – abcdn

+0

對不起,刪除回覆。它失控了,我後來注意到我永遠無法用評論中的字符限制來解釋我自己。請參閱原始問題中的edit0。 – xtrom0rt

+0

對不起,但你想解釋的是我的一個謎。在您的三條評論之後,我並不瞭解您要做什麼,也不知道您保存了哪些數據,也不知道爲什麼,處理來自匿名用戶的DB現有產品數據比使用非現有產品更安全。兩者同樣不安全。你不應該允許匿名用戶寫你的數據庫,這就是你需要知道的。 – abcdn

0
class ProductSerializer(ModelSerializer): 
    class Meta: 
     model = Product 
     fields = ('id', ...) 
     read_only_fields = ('id',) 
+0

這是給我一個刺痛的頭痛的確切解決方案 – xtrom0rt

相關問題