Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 烧瓶/SQLAlchemy-模型数据验证_Python_Sqlalchemy - Fatal编程技术网

Python 烧瓶/SQLAlchemy-模型数据验证

Python 烧瓶/SQLAlchemy-模型数据验证,python,sqlalchemy,Python,Sqlalchemy,数据库:MySQL 我试图想出一个优雅的方法来验证传入的JSON post数据(这是一个接受JSON的API,没有表单),无论是在创建新的SQLAlchemy模型之前还是之后(在数据库插入/更新之前) A) 我见过@验证装饰程序,但对我来说,它在两个方面失败: 它不处理验证不可为空的字段,因为它只是 数据更改时启动 所有文档都显示抛出错误,我更希望知道模型上的所有错误是什么,这样我就可以用错误json(ie model.errors)进行响应 B) 我已经研究了Marshamallow的验证

数据库:MySQL

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

A) 我见过@验证装饰程序,但对我来说,它在两个方面失败:

  • 它不处理验证不可为空的字段,因为它只是 数据更改时启动
  • 所有文档都显示抛出错误,我更希望知道模型上的所有错误是什么,这样我就可以用错误json(ie model.errors)进行响应
B) 我已经研究了Marshamallow的验证/序列化功能——尽管它似乎是一个潜在功能,但对于我认为应该与模型更密切相关的功能来说,它似乎有很多开销

C) 带有json属性的Flask输入看起来像是一个中间地带,但我似乎无法让它与嵌套的json一起工作,我也想知道如何分解多个条目(即多个汽车对象进入)

D) 我还研究了如何使用WTF表格(见评论)。这是可行的,并且外部无法获得所需的烧瓶输入。这看起来确实是最有希望/最简单的——但是用所有的开销构建这些表单对象只是为了使用它们的验证器,确实让人觉得很奇怪

我真的很想知道我是否完全错了,在pseudo/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世界,在那里我可以问一些模型问题,比如(这里的命名有点松散)

  • .你脏吗?--数据是否仍与上次保存的数据相同
  • .有效吗?--模型是否通过完整性检查
  • .你得救了吗?--模型是否持久化
  • .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)
    

    也许你要找的是表单,我也走了这条路,把数据塞进表单对象中让他们检查似乎有点不妥。我已经证明它是有效的,但似乎不对@Roganjosh为什么会有点黑?我想您将使用WTForms验证器并提供反馈,因为创建这些表单对象的开销比验证要大得多@罗甘约什。。。再一次,我走了这条路,它被证明了,我希望有一种方法可以减少为这个用例使用表单的次数