0

私はFlask(vsn 0.8)とFlask-WTF(vsn 0.5.2)(たとえば、フォームの解析)を使用して、非常にシンプルなWebサイトを作成しています。ただし、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の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__はこのコードがあります。これは通常、formdataが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

于 2013-06-11T17:00:37.983 に答える
2

アプリをサイトのルートに移動し、そこにあったアプリ(=冗長)を削除しrequest.formて、MyFormクラスに追加しました。それはそれを修正するようです。csrf_enabledfalseに設定する必要もありました。

@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 に答える