重定向后Flask请求为空

时间:2013-11-14 01:40:08

标签: python request flask

使用Flask,我可以在函数poll()中访问request.form数据,但在重定向之后,request.form为空。

我确定这是故意的,我必须明确传递,但是如何?

from flask import render_template, redirect, request

from app import app
from forms import PollForm

@app.route('/poll', methods = ['GET', 'POST'])
def poll():
    form = PollForm()

    if form.validate_on_submit():
        print request.form # returns ImmutableMultiDict with data
        return redirect('/details')

    return render_template('poll.html', form=form)

@app.route('/details')
def details():
    print request.form # returns empty ImmutableMultiDict
    return render_template('details.html')

3 个答案:

答案 0 :(得分:3)

从POST重定向很常见,但您不应再在详细信息功能中使用表单数据了。

您应该在poll函数中处理表单提交,然后重定向到详细信息,我假设这些信息会显示一些更新的数据 - 例如来自数据库。

@app.route('/poll', methods = ['GET', 'POST'])
def poll():
    form = PollForm()
    if form.validate_on_submit():
        # use request.form to update your database
        return redirect('/details')
    return render_template('poll.html', form=form)

@app.route('/details')
def details():
    # query the database to show the updated poll
    return render_template('details.html')

答案 1 :(得分:2)

重定向以响应POST请求是非常标准的,因为它解决了围绕书签和重复表单提交的奇怪浏览器行为。该技术甚至有一个名称和维基百科页面:Post/Redirect/Get

要保留POST请求中的数据,您必须使用某种形式的每用户持久存储。可能的选项是数据库,用户会话(flask.session)或cookie。

答案 2 :(得分:1)

在这种特定情况下,我不确定为什么需要重定向。你应该这样做:

@app.route('/poll', methods = ['GET', 'POST'])
def poll():
    form = PollForm()

    if form.validate_on_submit():
        return render_template('details.html', form = form)

    return render_template('poll.html', form=form)

您不需要额外的冗余视图来显示细节。在上面的视图中,键是在行

return render_template('details.html', form = form)

上面的代码将表单详细信息提供给details.html模板,然后可以轻松地解析数据并根据需要显示它。

但是,如果您真的想使用重定向,那么您可以尝试使用下面的内容。这样,您就可以将form传递给重定向。

return redirect(url_for('details', form=form))