【问题标题】:Creating several DB instances from a single POST request从单个 POST 请求创建多个数据库实例
【发布时间】:2020-06-08 07:28:41
【问题描述】:

我有一张这样的桌子:

class Mapping(db.Model):
    map_id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer)
    bike_id = db.Column(db.String(255))
    is_active_data = db.Column(db.Boolean, default=True)
    created_by = db.Column(db.String(150))
    updated_by = db.Column(db.String(150))

我的POST方法:

def save_MapperM(adddata):
    create_data = Mapping(**adddata)
    db.session.add(create_data)
    db.session.commit()
    return dict(Successful="Successfully Created")

路线:

@test.route("/addmapper"))
class MapperV(Resource):
    @staticmethod
    def post():
        if request.method == 'POST':
            save_data = request.get_json()
            try:
                return jsonify(save_MapperM(save_data))
            except Exception:
                return jsonify({'Unsuccessful': 'Looks like you missed something !!'})

当前代码:

  • 当前代码将只为每个请求使用一个 bike_id。

要求:

  • 我想将多个bike_id 用作一个用户ID,并将其作为多条记录存储在表级别中。

来自 UI 的示例数据格式:

   { user_id: 1, bike_id: 1,2,3,4 }

【问题讨论】:

  • 你能添加你的烧瓶路由功能吗?如何获取请求参数并将其传递给save_MapperM 函数?
  • @SergeyShubin,请检查更新的代码

标签: python-3.x flask flask-sqlalchemy


【解决方案1】:

最简单的解决方案是使用循环修改您的save_MapperM 函数:

def save_MapperM(adddata):
    for bike_id in adddata["bike_id"]:
        item_data = adddata.copy()
        item_data["bike_id"] = bike_id
        create_data = Mapping(**item_data)
        db.session.add(create_data)
    db.session.commit()
    return dict(Successful="Successfully Created")

但是要小心这个函数,因为它允许使用从 POST 请求中接收到的任何参数来创建 Mapping 实例。看起来它是有意的,但如果您的 Mapping 类有一些只应在服务器端填充的私有属性,它可能会导致安全问题。例如用户“Mike”可以发送请求:

{ "user_id": 1, "bike_id": [1, 2], "created_by": "Alex", "updated_by": "Alex" }

这将导致save_MapperM 函数创建实例,并将created_byupdated_by 值设置为“Alex”,这可能不是真的。最好从session data获取此类属性。

所以你的 post 方法可能看起来像这样(postsave_MapperM 功能组合):

def post():
    request_data = request.get_json()
    for bike_id in request_data.get("bike_id", []):
        item = Mapping(
            user_id=request_data.get("user_id"),
            bike_id=bike_id,
            created_by=session.get("username"),
            updated_by=session.get("username"),
        )
        db.session.add(item)
    try:
        db.session.commit()
    except Exception:
        return jsonify({"success": False})
    return jsonify({"success": True})

下一步可能是实现请求 JSON 数据验证。当您有几个具有简单结构的 JSON 键时,这是可以的,但是当您需要传递大量数据时,您需要确保它是正确的。例如,您可以为此 Marshmallow 使用一些序列化/ODM 库。

【讨论】:

  • @sukumarkumar 它与您的问题中的Mapping 类(SQLAlchemy 模型)相同。
猜你喜欢
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 2018-08-08
  • 2019-03-07
  • 1970-01-01
相关资源
最近更新 更多