0

我正在使用 Flask (vsn 0.8) 和 Flask-WTF (vsn 0.5.2)(例如,解析表单)来制作一个非常简单的网站。但是,我无法让 Flask-WTF 正确解析我的 GET 结果。

我的相关代码如下所示:

@app.route("/result", methods=("GET", "POST"))
def submit():
    form = MyForm()
    print request.args
    print request.args.get('aws_id', None, type=str)
    print form.is_submitted()
    if form.validate_on_submit():
        flash('Success')
        aws_id = form.aws_id.data
    return render_template("index.html", form=form)

如果我使用 GET 提交包含名为“aws_id”的单个字段的表单,我会在控制台上获得以下输出。

127.0.0.1 - - [19/Oct/2011 22:28:59] "GET /result?aws_id=test_string HTTP/1.1" 200 -
ImmutableMultiDict([('aws_id', u'test_string')])
test_string
False

在我看来,提交工作正常,但 Flask-WTF 并没有做它的事情。本质上,处理表单输出的旧方法是 request.args.get 方法,但新的 form.is_submitted 和 form.validate_on_submit 并没有发挥它们的魔力。

有任何想法吗?(WTF!)

4

2 回答 2

3

Flask-WTF 的Formis_submitted方法如下所示:

def is_submitted(self):
    """
    Checks if form has been submitted. The default case is if the HTTP
    method is **PUT** or **POST**.
    """

    return request and request.method in ("PUT", "POST")

并且它__init__有这个代码,通常可以确保从 Flask 请求中自动加载 formdata:

    if formdata is _Auto:
        if self.is_submitted():
            formdata = request.form

所以很明显......如果您通过 GET 提交表单,您将不会得到任何好的自动行为。这是可以理解的,因为如果是 GET 请求,则不清楚是表单已提交还是您只是在加载页面。这不包括任何 CSRF 问题。

validate_on_submit也不起作用,因为它还依赖于is_submitted

Flask 本身也不会request.form为您解析 GET 字段。

你最终不得不做类似的事情:

form = MyForm(request.args, csrf_enabled=False)
if 'aws_id' in request.args and form.validate():
    flash('Success')
    aws_id = form.aws_id.data

(都假设你的MyForm类继承自from flask.ext.wtf import Form

于 2013-06-11T17:00:37.983 回答
2

我将我的应用程序移至站点的根目录,删除了那里的应用程序(=冗余),然后添加request.form到 MyForm 类中。这似乎可以解决它。还需要设置csrf_enabled为 false。

@app.route("/", methods=("GET", "POST"))
def submit():
    form = MyForm(request.form, csrf_enabled=False)
    if form.validate_on_submit():
        print form.data

    return render_template("index.html", form=form)
于 2011-10-20T15:24:17.590 回答