我正在嘗試在燒瓶 api 中插入一組物件。我們使用棉花糖進行反序列化。我的端點如下所示:
@blp.arguments(SomeSchemas, location='json', as_kwargs=True)
@blp.response(200, SomeSchemas)
def post(self, some_schemas: SomeSchemas) -> dict:
架構是一個簡單的架構,如下所示:
class SomeSchemas(ma.Schema):
schemas = ma.fields.List(ma.fields.Nested(SomeSchema))
class SomeSchema(ma.Schema):
a = ma.fields.String()
b = ma.fields.Integer()
當我發布到端點時,我確實得到了正確資料的串列,但它以字典的形式出現,而不是被正確地翻譯成物件。
我也嘗試過使用物件串列(List[SomeSchema]、SomeSchema(many=True) 等),但我似乎無法弄清楚。
我認為這是一個非常常見的用例(提供引數串列)并且我缺少一個明顯的解決方案,但我似乎找不到任何關于如何正確執行此操作的參考。需要明確的是,我正在尋找使用串列(或其他一些集合型別,沒關系)呼叫端點的正確方法,并且說串列被正確反序列化并具有正確的物件型別。
uj5u.com熱心網友回復:
免責宣告:flask-smorest 維護者發言。
我認為這個問題與輸入是一個串列這一事實無關。
IIUC,您的問題是您在視圖函式中注入了字典,而不是物件。這是默認的棉花糖行為。它可以在棉花糖中通過使用post_load鉤子來實際實體化物件來覆寫。
我一般不會那樣做。在實踐中,我發現在視圖函式中實體化物件更好。例如,在 PUT 資源中,我更喜歡從 DB 實體化現有專案,然后用新資料更新它。在這種情況下,將新資料作為 dict 比 object 更好。
可能沒有一個單一的事實,在這里,它可能是一個意見問題,但是雖然在裝飾器中實體化物件并傳遞給視圖的想法很吸引人,但它可能有點濫用捷徑。
我意識到這個答案是“不知道,但無論如何你都不應該這樣做”的型別。只是說laybe你不應該努力實作這一目標。
這就是說,如果它與非串列/非嵌套輸入一起作業,我會感到驚訝,我想知道為什么它在這種情況下不能特別作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/456120.html
上一篇:無法查詢和遍歷資料庫
下一篇:角度組件不更改模板
