python - Flask / SQLAlchemy - 模型数据验证
问题描述
数据库:MySQL
我试图想出一种优雅的方法来验证传入的 JSON 发布数据(这是一个接受 JSON 的 API,没有 FORMS),无论是在用于创建新的 SQLAlchemy 模型之前还是之后(在数据库插入/更新之前)。
A) 我已经看到了@validates装饰器,但对我来说,它以两种方式失败:
- 它不处理验证不可为空的字段,因为它仅在数据更改时启动
- 所有文档都显示抛出错误,我更愿意知道模型上的所有错误是什么,所以我可以用错误 json(即 model.errors)回复
B) 我已经研究了 Marshamallow 进行验证/序列化 - 虽然它看起来像是一种潜力,但对于我认为应该与模型更密切相关的东西来说,它似乎有很多开销
C) 带有 json 属性的 Flask-Inputs 似乎是一个中间立场,但我似乎无法让它与嵌套的 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 世界,在那里我可以询问模型的东西,例如(这里命名松散,有点)
- 。是脏的?-- 数据还是和上次保存的一样吗
- 。已验证?-- 模型是否通过完整性检查
- .is_saved? --- 模型是否持久化
- .error - 提供错误字段的字典:{key:error}
等等......再次,也许我只是在看 SQLAlchemy 范式偏移或其他东西,但这里的任何指导都会很棒!
解决方案
选择 Marshmallow .. 的组合
- 前置和后置数据过滤器/装饰器
- 验证者
- 错误消息
- 序列化数据响应
- 一旦我开始使用它,它比预期的要简单
代码最终是:
@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)
推荐阅读
- youtube - 如何在 Youtube 上禁用“观看次数最多”播放
- mysql - 有没有 MySQL 5.8 版本?
- java - 为什么Java程序在执行增量运算符后终止?在下面的代码中它只打印 2 而不是条件语句?
- java - 编写一个程序,使用 Java AWT 组件按选择顺序在列表中显示所选项目
- python - 在一堆卡片中搜索 Python 类时遇到问题(尝试实现蝎子纸牌游戏)
- vim - 使用 vimscript,如何知道一行的 no 是否发生了变化?
- sql - 在 Oracle 中使用 CASE WHEN 更新查询
- python - Google reCAPTCHA v2 和 Selenium
- database - com/intellij/database/model/BaseModel$BasePositioningNamingFamily.renewAt 的 @NotNull 参数“名称”的参数不能为空
- android - 处理来自 web 的大型 JSON 响应并将其用于带有 RecyclerView/ListView 的 SearchView