Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.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
Flask 仅当客户端发送保存请求同时维护会话上下文时保存模型更改的最佳实践?_Flask_Flask Sqlalchemy - Fatal编程技术网

Flask 仅当客户端发送保存请求同时维护会话上下文时保存模型更改的最佳实践?

Flask 仅当客户端发送保存请求同时维护会话上下文时保存模型更改的最佳实践?,flask,flask-sqlalchemy,Flask,Flask Sqlalchemy,我有一个flask应用程序,其中客户端不断地对数据库中模型中的对象进行更改。然后,当客户端显式发送“Save”请求时,对象的新状态应该保存到数据库中。如果客户端没有发送“Save”请求,我希望放弃所有字段更改,并在更改之前将对象状态恢复为原始状态,以便下次加载对象时处于原始状态 问题是,我需要将对象上甚至未保存的更改保存到DB,以便为客户端的下一个请求提供会话上下文。会话中的未来请求需要对象的最新状态。但使用这种方法,我实际上完全失去了对象的原始状态 下面是一些例子 #models.py - s

我有一个flask应用程序,其中客户端不断地对数据库中模型中的对象进行更改。然后,当客户端显式发送“Save”请求时,对象的新状态应该保存到数据库中。如果客户端没有发送“Save”请求,我希望放弃所有字段更改,并在更改之前将对象状态恢复为原始状态,以便下次加载对象时处于原始状态

问题是,我需要将对象上甚至未保存的更改保存到DB,以便为客户端的下一个请求提供会话上下文。会话中的未来请求需要对象的最新状态。但使用这种方法,我实际上完全失去了对象的原始状态

下面是一些例子

#models.py - saves an object in the  dashboard field

class Dash(db.Model):

    id = db.Column(db.INTEGER, primary_key=True)
    name = db.Column(db.String(20), nullable=False)
    dashboard = db.Column(db.PickleType(),nullable=True)
在我的路线中,我有以下方法更新对象中的某个属性:

#routes.py

class setInputAPI(Resource):
    def post(self):
        dash = getdash() #gets latest DB object

        dash.value = request.json['new_val'] #changes an object attribute 

        updateDB(dash) #update db with new object so future requests have context
        return {'message':'success'}

#Helper functions
def getdash():
    dash_id = request.json['dash_id']
    dash = Dash.query.get_or_404(dash_id).dashboard
    return dash

def updateDB(dash):
    dash_id = request.json['dash_id']
    db.session.query(Dash).filter(Dash.id == dash_id).update({'dashboard': dash})
    db.session.commit()
当发送上述
setInputAPI
请求时,我的数据库状态将被更新,以反映客户端的更改,而客户端甚至不发送保存请求。因此,我丢失了所有原始数据,如果客户端在将来的会话中重新加载此对象,他们将看到其更改的对象,而不是上次保存的对象

一个可能的解决方案是创建一个重复的表,该表只跟踪对象最后保存的状态,并加载该状态

因此,我可以有两个表-一个用于跟踪上次保存的状态,另一个用于跟踪当前未保存的状态


但我不得不想象,一定有更好的方法来实现这一点,因为这似乎有点骇人听闻?

一个选项可能是存储挂起的更改,并且只在用户保存时修改数据库。有趣。会话对象多线程/多进程安全吗?是的,默认实现存储在客户端。不要在其中存储任何敏感内容e、 1.您可以有多个数据状态,如“草稿”、“已保存”。或2.将中间状态存储在浏览器本地存储器中?