質問

私は 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)

「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 は魔法のような機能を発揮しません。

何か案は?(なんと!)

役に立ちましたか?

解決

アプリをサイトのルートに移動し、そこにあったアプリ(=冗長)を削除して、request.formをMyFormクラスに追加しました。それはそれを修正するようです。また、csrf_enabledをfalseに設定する必要がありました。 ジェネラコディセタグプレ

他のヒント

フラスコ-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)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top