簡體   English   中英

Python Flask json 模式驗證

[英]Python flask json schema validation

我在我的新項目中使用了 Flask 框架。 它將從帖子中獲取 JSON 數據並發送 JSON 響應。 所以,我需要驗證我的 JSON 請求。 我見過幾個圖書館。 但是這些庫沒有按預期工作。 最后,我決定使用flask-jsonschema-validator。 它適用於單個 JSON 對象。 如果請求對象具有嵌套對象,則它不起作用。 例如,

from flask_jsonschema_validator import JSONSchemaValidator
JSONSchemaValidator(app=app, root="schemas")

這是我對驗證器的初始化。

# If any error occurred in the request.
@app.errorhandler(jsonschema.ValidationError)
def json_validation_error(e):
    return json_response("error", str(e), {})

這是我的錯誤處理程序

@app.validate('model', 'save') def save_model():

這是我的實現。

{
  "save": {
    "type": "object",
    "properties": {
      "workspace": {"type": "object"},
      "name": {"type": "string"},
      "description": {"type": "string"},
      "uri": {"type": "string"},
      "type": {
         "name": {"type": "string"},
      }
    },
    "required": [ "workspace", "name", "description", "uri", "type"]
  }
}

這是我的 model.json 文件。 它正在驗證除“類型”之外的請求。 如何使用嵌套對象對 JSON 請求應用驗證

請幫助任何人解決這個問題

提前致謝。

flask-expects-json包檢查嵌套對象上的變量類型。

它可以作為您路線上的裝飾器。

SCHEMA = {
    "type": "object",
    "properties": {
      "workspace": {"type": "object"},
      "name": {"type": "string"},
      "description": {"type": "string"},
      "uri": {"type": "string"},
      "type": {
         "type": "object",
         "properties": {
              "name": {"type": "string"},
         }
      }
    },
    "required": ["workspace", "name", "description", "uri", "type"]
}

@expects_json(SCHEMA)
def my_route(self, **kwargs):
    pass

如果驗證復雜的嵌套對象,我會推薦 JSONSchema 的替代工具。 我可以在GoodJSON 中復制您的架構驗證,如下所示。 如您所見,制定驗證模式只是組合了一堆可應用於對象、列表和原始值的自包含驗證器函數。

from goodjson.validators import is_dict, is_string, is_uri, foreach_key


validate_fun = foreach_key(
    save=[foreach_key(
        workspace=[is_dict],
        name=[is_string],
        description=[is_string],
        uri=[is_uri],
        type=[foreach_key(
            name=[is_string]
        )]
    )]
)

validate_fun(YOUR_JSON_DATA_OBJECT)

免責聲明:我是 GoodJSON 的作者。

暫無
暫無

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

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