从单个POST请求创建多个数据库实例

时间:2020-06-08 07:28:41

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

我有一个这样的表:

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。

要求:

  • 我要对一个用户ID采取多个bike_id,并将其作为多个记录存储在表级别。

来自UI的示例数据格式:

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

1 个答案:

答案 0 :(得分:0)

最简单的解决方案是使用循环修改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库。