我有一个小的日志浏览器.它根据用户的输入检索并显示以前记录的记录列表.它不会更新任何内容.
代码非常简单,工作正常.这是一个简化版本:
@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)
Run Code Online (Sandbox Code Playgroud)
但是它不遵循post/redirect/get模式,我想解决这个问题.
我应该在哪里存储发布数据(即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)
Run Code Online (Sandbox Code Playgroud)
因此,最终post/redirect/get模式可以防止多次提交表单数据.由于您的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)
Run Code Online (Sandbox Code Playgroud)
此外,要使用会话,您必须将一个secret_key集作为应用程序配置的一部分.
Per ThiefMaster的评论,在这里重新安排逻辑顺序,允许使用WTForms验证方法进行无效表单提交,因此无效的表单提交不会丢失.
| 归档时间: |
|
| 查看次数: |
2070 次 |
| 最近记录: |