Flask-WTF未处理我的表单响应

0 投票
2 回答
3066 浏览
提问于 2025-04-17 04:40

我正在使用Flask(版本0.8)和Flask-WTF(版本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)

当我提交一个只有一个字段叫做'aws_id'的表单时,使用GET请求,我在控制台上看到的输出是这样的。

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这两个方法却没有起到应有的效果。

有没有什么想法?(真是让人困惑!)

2 个回答

3

Flask-WTF的 Form 类里面有个 is_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的请求中加载:

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

所以很明显,如果你是通过GET方式提交表单,就不会有那些方便的自动行为。这是可以理解的,因为GET请求不太能确定你是提交了表单,还是单纯在加载页面。这还涉及到一些CSRF(跨站请求伪造)的问题。

validate_on_submit 也不管用,因为它也依赖于 is_submitted

Flask本身也不会把GET请求的字段解析到 request.form 里。

最后你只能做一些像这样的事情:

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 继承的)

2

我把我的应用程序移动到了网站的根目录,删除了之前的那个(因为是多余的),然后在 MyForm 类里添加了 request.form。这样似乎就解决了问题。此外,还需要把 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)

撰写回答