如何重写此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应用程序配置中包含一组。

Flask Session API

更新1/9/16

根据ThiefMaster的评论,此处重新排列了逻辑顺序,以允许对无效的表单提交使用WTForms验证方法,因此不会丢失无效的表单提交。