如何重写此Flask视图函数以遵循post/redirect/get模式?

VPf*_*PfB 3 python 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)
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)

abi*_*son 6

因此,最终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集作为应用程序配置的一部分.

Flask Session API

更新2016年1月9日

Per ThiefMaster的评论,在这里重新安排逻辑顺序,允许使用WTForms验证方法进行无效表单提交,因此无效的表单提交不会丢失.