如何重写此Flask视图功能以遵循发布/重定向/获取模式?
问题内容:
我有一个小型的日志浏览器。它根据用户的输入检索并显示以前记录的记录的列表。它不会更新任何内容。
该代码非常简单,并且运行良好。这是一个简化的版本:
@app.route('/log', methods=['GET', 'POST'])
def log():
form = LogForm()
if form.validate_on_submit():
args = parse(form)
return render_template('log.html', form=form, log=getlog(*args))
return render_template('log.html', form=form)
但是,它不遵循发布/重定向/获取模式,我想解决此问题。
我应该args
在发布和获取之间在哪里存储发布的数据(即)?什么是标准或推荐方法?我应该设置一个cookie吗?我应该使用flask.session对象在那创建一个缓存吗?您能指出我正确的方向吗?大多数时候我在写后端…
更新:
我正在发布结果代码。
@app.route('/log', methods=['POST'])
def log_post():
form = LogForm()
if form.validate_on_submit():
session['logformdata'] = form.data
return redirect(url_for('log'))
# either flash errors here or display them in the template
return render_template('log.html', form=form)
@app.route('/log', methods=['GET'])
def log():
try:
formdata = session.pop('logformdata')
except KeyError:
return render_template('log.html', form=LogForm())
args = parse(formdata)
log = getlog(args)
return render_template('log.html', form=LogForm(data=formdata), log=log)
问题答案:
因此,最终,邮寄/重定向/获取模式可以防止多次提交表单数据。由于您POST
实际上未在进行任何数据库更改,因此您使用的方法似乎不错。通常,在模式中POST
会更改基础数据结构(例如UPDATE
/ INSERT / DELETE),然后在重定向时查询更新后的数据(SELECT),因此通常不需要在重定向和重定向之间存储任何内容。得到。
话虽这么说,我的处理方法是使用Flask会话对象,这是Flask为您管理的cookie。您可以执行以下操作:
@app.route('/log', methods=['GET', 'POST'])
def log():
form = LogForm()
if form.validate_on_submit():
args = parse(form)
session['log'] = getlog(*args)
return redirect(url_for('log'))
saved = session.pop('log', None)
return render_template('log.html', form=form, log=saved)
另外,要使用会话,必须在secret_key
应用程序配置中包含一组。
更新1/9/16
根据ThiefMaster的评论,此处重新排列了逻辑顺序,以允许对无效的表单提交使用WTForms验证方法,因此不会丢失无效的表单提交。