#質問したいこと
flask_wtfで作成したフォームにsubmitのバリデーション(.validate_on_submit)を行った際に、CSRFProtect()が必要となる条件が知りたいです。
※そもそもどのようなパターンでも必要、というのが答えだと思うのですが、挙動について確認したく。
Flaskでアンケートフォームを作成していた際に、
python
1class CountForm(FlaskForm): 2 count = StringField('count', validators = [DataRequired()]) 3 submit = SubmitField('Submit') 4 5@app.route('/count', methods=['GET', 'POST']) 6def f_count(): 7 form = CountForm() 8 if form.validate_on_submit(): 9 session['count'] = int(form.count.data) 10 return redirect(url_for('f_goal')) 11 else: 12 return render_template('count.html', form = form)
としていた際には特にcsrf=CSRFProtect()を行っていなかったのですが、フォーム送信後、form.validate_on_submit()がTrueとなっていました。
ただ下記のように、フォームの数を増やし、FieldListを利用した際にはcsrf=CSRFProtect()がないとフォームに値を入れてsubmitしてもform.validate_on_submit()がFalseを返していました。
ちなみにいずれの場合も、app.config['SECRET_KEY']は設定しています。
python
1class CountForm(FlaskForm): 2 count = StringField('count', validators = [DataRequired()]) 3 submit = SubmitField('Submit') 4 5class GoalForm_child(FlaskForm): 6 imp = IntegerField('imp', validators = [DataRequired()]) 7 goal = StringField('goal', validators = [DataRequired()]) 8 9class GoalForm(FlaskForm): 10 goals = FieldList(FormField(GoalForm_child, 'goals'), min_entries=2) 11 submit = SubmitField('Submit') 12 13@app.route('/count', methods=['GET', 'POST']) 14def f_count(): 15 form = CountForm() 16 if form.validate_on_submit(): 17 session['count'] = int(form.count.data) 18 return redirect(url_for('f_goal')) 19 else: 20 return render_template('count.html', form = form) 21 22 23@app.route('/goal', methods=['GET', 'POST']) 24def f_goal(): 25 form = GoalForm() 26 counts = range(1, session.get('count') + 1, 1) 27 if form.validate_on_submit(): 28 return redirect(url_for('f_work')) 29 else: 30 return render_template("input_goal.html", form = form, counts = counts)
複数ページ、複数フォームになったため、csrfトークンがないとリクエストが受理されないようになっているのでしょうか?
お知恵お借りできますと幸いです。
あなたの回答
tips
プレビュー