3

動的に入力された SelectField を含むフォームを送信するときに問題が発生します。何らかの理由で、Flask が CSRF トークンを検証しようとすると、SelectField がフォームにあると常に失敗します。フォームから SelectField を削除すると、CSRF トークンが正常に検証されます。

誰かがこの動作に遭遇しましたか?

編集

形:

class AddToReportForm(Form):
    selectReportField = SelectField(u'Reports',choices=[('test1','test')])

    def __init__(self, *args, **kwargs):
        """
        Initiates a new user form object
        :param args: Python default
        :param kwargs: Python default
        """
        Form.__init__(self, *args, **kwargs)




    def validate(self,id_list):
        rv = Form.validate(self)

        if not rv:
            print False
            #Check for the CSRF Token, if it's not there abort.
            return False

        print True
        return True

ジンジャ2:

<form  method=post name="test">
{{ form.hidden_tag()}}




    {{ form.selectReportField }}
    <a href="#" onclick="$(this).closest('form').submit()" class="button save">Add to report</a>

</form>

レンダリング:

form = AddToReportForm()
return render_template('random',title='add reports',form=form
4

3 に答える 3

3

SECRET_KEY をどこに設定していますか? Form クラスのいずれかで使用できる必要があります。

class AddToReportForm(Form):
    selectReportField = SelectField(u'Reports',choices=[('test1','test')])
    SECRET_KEY = "myverylongsecretkey"

    def __init__(self, *args, **kwargs):
        """
        Initiates a new user form object
        :param args: Python default
        :param kwargs: Python default
        """
        Form.__init__(self, *args, **kwargs)
    def validate(self,id_list):
        rv = Form.validate(self)

        if not rv:
            print False
            #Check for the CSRF Token, if it's not there abort.
            return False
        return True

またはアプリケーションのブートストラップで:

app = Flask(__name__)
app.secret_key = 'myverylongsecretkey'

またはコンストラクターで:

form = AddToReportForm(secret_key='myverylongsecretkey')
return render_template('random',title='add reports',form=form)
于 2013-05-29T13:31:30.570 に答える
2

SelectField と CSRF の間の接続はまだわかりません。このvalidateメソッドはあまり疑わしくなく、追加の引数は次のテストケースで失敗しますが、現状では問題なく動作しているようです:

from flask import Flask, render_template_string
from flaskext.wtf import Form, SelectField

app = Flask(__name__)
app.debug = True
app.secret_key = 's3cr3t'


class AddToReportForm(Form):
    selectReportField = SelectField(u'Reports', choices=[('test1', 'test')])


@app.route('/test', methods=['GET', 'POST'])
def test():
    form = AddToReportForm()
    if form.validate_on_submit():
        print 'OK'
    return render_template_string('''\
<form method=post name="test">
{{ form.hidden_tag()}}
{{ form.selectReportField }}
<input type="submit">
</form>
''', form=form)


app.run(host='0.0.0.0')
于 2013-05-29T16:33:23.777 に答える