2

使用 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')
4

3 回答 3

3

从 POST 重定向很常见,但在 details 函数中您不再需要表单数据。

您应该在 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')
于 2013-11-14T02:48:02.923 回答
2

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

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

于 2013-11-14T05:51:32.443 回答
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))
于 2013-11-14T14:56:37.513 回答