簡體   English   中英

帶有(反)序列化器和模式驗證的Python JSON REST框架(jsonschema / avro)

[英]Python JSON REST framework with (de)serialiser and schema validation (jsonschema/avro)

我認為我的問題很常見。 我想在Python中構建一個JSON REST API(后面可能還有R),以便在應用程序之間交換數據。 (此時我不想使用BJSON或其他二進制格式)

鑒於模式和(反)序列化框架的可用性,我認為構建一個執行以下操作的系統是直截了當的:

  1. 它需要通過HTTP get請求輸入,
  2. 將它轉換/解析/反序列化為python對象,
  3. 在給定通用模式語言描述的情況下驗證python對象,
  4. 用參數做一些事情來獲取結果數據,和
  5. 將結果數據序列化為JSON,
  6. 驗證結果json,
  7. 歸還它。

我想使用與語言無關的模式語言 - 沒有任何只用於一種語言的語言。 我將avro和json-schema視為模式語言和(de)序列化的生態系統,但到目前為止我找不到任何涵蓋該法案的工具。 一個特殊的問題是反序列化。 有一些庫可以序列化,但是后來有URL GET參數的問題,這些參數是字符串而不是整數。

?名稱=米奇年齡= 4

給定一個架構(avro)

{
"type": "record",
"name": "User",
"namespace": "example.avro",
"fields": [
    {
    "name": "name",
    "type": "string"
    },
    {
    "name": "age",
    "type": "int"
    }
]
}

我想得到一個字典(名字='米奇',年齡= 4)。

我已經失去了很多時間已經嘗試了不同的工具和框架,我正處於一個階段,我正在考慮從頭開始編寫反序列化器。

我環顧四周,沒有找到我想要的東西。 Marshmallow等項目接近尾聲。 它們允許規范模式並提供序列化,但我希望jsonschema格式具有互操作性。

所以我圍繞一個代表數據的pandas數據框編寫了我自己的序列化器/反序列化器類。 它有方法

  1. 用於從字典或json對象創建數據幀(反序列化)2。用於強制數據類型,
  2. 用於推斷架構,
  3. 用於驗證架構,以及
  4. 用於序列化到json。

目前還不是很清楚序列化和反序列化的問題是什么。 大多數Web框架不會將URL查詢參數視為JSON對象,而是單獨處理每個密鑰,並允許您將查詢字符串作為字典(或作為請求處理程序的參數,具體取決於框架)進行訪問。 request.query['name']這樣的東西。 JSON通常顯示為POST,PUT,PATCH的有效負載以及請求的響應。 即使在這種情況下,您也可以將其作為字符串獲取並執行類似json.loads來獲取Python數據結構,然后您可以使用json-schema或avro驗證器庫進行驗證。

我想到了兩件事。

首先,在Flask之上編寫了一個Eve REST框架

它的作者還創建了一個名為Cerberus的模式/驗證語言(並在Eve中使用),它完全符合您的要求。 Eve將您的JSON存儲在MongoDB中。

如果您的應用程序不是非常廣泛並且使用已經開箱即用的Django或包裝中提供的各種工具,我會堅持使用Eve。 (哎呀,不打算在這里開始永恆的Django-vs-Flask火焰)


其次, Mongoengine庫為JSON提供了Django風格的模式。

它的目的是為Django提供MongoDB的支持,並設計其架構模仿Django的架構。 Mongoengine本身相當穩定,但它與優秀的 Django REST框架Django REST框架 - Mongoengine的集成絕不是任何方式。

此外,還有Mongoengine與Eve和Flask的綁定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM