python - Flask/SQLAlchemy - 模型数据验证

标签 python sqlalchemy

数据库:MySQL

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

A) 我见过 @validates 装饰器,但对我来说,它以两种方式失败:

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

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

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

D) 我还研究过使用 WTF-Forms(见评论)。这是有效的,并且外部无法让 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 -- 提供错误字典字段:{key: error}

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

最佳答案

选择棉花糖..的组合

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

代码最终为:

@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)

关于python - Flask/SQLAlchemy - 模型数据验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56808057/

相关文章:

python - 无法使用 pymongo 删除记录

python - 如何使用 Python 捕获 subprocess.call 错误?

python - Flask:如何在 SQLAlchemy 中使用多个表

python - 如何防止sqlalchemy中的嵌套查询再次选择表?

python - 访问 header 名称时 OO 设计 : an object that can be exported to a "row",,不重复自己

python - 使用 pycomm 将数据从 PLC 打印到 Python

python - Pandas 按城市和月份分组并填写缺失的月份

python - 使用 session.query 读取 SQLAlchemy 中未提交的数据

python - SQLAlchemy:带有 GENERATED ALWAYS AS 的 MySQL 列 DDL

python - 模拟 SQLAlchemy 的默认属性