Flask / SQLAlchemy-模型数据验证

时间:2019-06-28 13:40:49

标签: python sqlalchemy

数据库:MySQL

我正在尝试提出一种优雅的方法来在用于创建新的SQLAlchemy模型之前或之后(在数据库插入/更新之前)验证传入的JSON发布数据(这是一个接受JSON的API,不接受FORMS)。

A) 我已经看到了 @validates 装饰器,但是对我来说,它以两种方式失败:

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

B) 我已经研究过Marshamallow进行验证/序列化-尽管它看起来很有潜力,但我觉得应该与模型更紧密地联系在一起的事情似乎有很多开销

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

D) Ive还研究了使用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. 。是否保存? ---模型是否持久
  4. .error-提供错误的指示 field:{key:error}

等...再次,也许我只是看着SQLAlchemy范例偏移量之类的东西,但是这里的任何指导都将是惊人的!

1 个答案:

答案 0 :(得分:0)

选择棉花糖..的组合

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

代码结束了:

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