【问题标题】:Flask / SQLAlchemy - Model Data ValidationFlask / SQLAlchemy - 模型数据验证
【发布时间】:2019-06-28 13:40:49
【问题描述】:

数据库:MySQL

我试图想出一种优雅的方法来验证传入的 JSON 发布数据(这是一个接受 JSON 的 API,没有 FORMS),无论是在用于创建新的 SQLAlchemy 模型之前还是之后(在数据库插入/更新之前)。

一) 我见过 @validates 装饰器,但对我来说有两种失败:

  • 它不处理验证不可为空的字段,因为它只是 数据更改时启动
  • 所有文档都显示抛出错误,我更想知道模型上的所有错误是什么,所以我可以用错误 json(即 model.errors)回复

B) 我已经研究了 Marshamallow 进行验证/序列化 - 虽然它看起来像是一种潜力,但对于我认为应该与模型更密切相关的东西来说,它似乎有很多开销

C) 带有 json 属性的 Flask-Inputs 似乎是一个中间立场,但我似乎无法让它与嵌套的 json 一起使用,并且还想知道如何分解多个条目(即进来的多个汽车对象)

D) 我还研究了使用 WTF-Forms(参见 cmets)。这是可行的,并且在外部无法让 Flask-Inputs 按需要工作。这看起来确实是最有希望/最简单的——但是使用它们的所有开销来构建这些表单对象只是为了使用它们的验证器确实感觉很奇怪。

我真的想知道我是不是走错了路,在伪/python 代码中,这是我理想的工作流程:

json_data = request.get_json()
for each car_data in json_data:
  car = Car(**car_data)
  if car.is_valid(): ## this would be a nice model integrity check
     session.add(car)
     session.commit(car)

我来自一个 Rails 世界,在那里我可以向模型询问一些事情,例如(这里命名松散,有点)

  1. .is_dirty? -- 数据还是和上次保存的一样吗
  2. .is_valid? -- 模型是否通过完整性检查
  3. .is_saved? --- 模型是否持久化
  4. .error -- 提供错误字典 field : {key: error}

等等......再次,也许我只是在看 SQLAlchemy 范式偏移或其他东西,但这里的任何指导都会很棒!

【问题讨论】:

  • 也许flask-wtforms就是你要找的
  • 我也走那条路,将数据塞入表单对象以供他们检查似乎很笨拙。我已经证明它有效,但它似乎并不正确。 @roganjosh
  • 为什么会是 hacky?您将使用 WTForms 验证器并提供反馈
  • 我猜是因为它创建了这些表单对象,这些对象的开销比验证要多得多。 @roganjosh ...再次,我走了那条路,事实证明,我希望有一种方法可以减少让表单适用于这个用例的方法

标签: python sqlalchemy


【解决方案1】:

选择棉花糖..的组合

  • 前后数据过滤器/装饰器
  • 验证器
  • 错误消息
  • 序列化数据响应
  • 一旦我开始使用它,它比预期的要简单

代码最终是:

@app.route('/collect', methods=['POST'])
def post_collect():
    json = request.get_json()

    device_data = DeviceSerializer().load(json)
    if device_data.errors:
        response = device_data.errors
    else:
        device = get_or_create(db.session, Device, **device_data.data)
        response = DeviceSerializer().dump(device).data

    return jsonify(response)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2019-05-27
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多