質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1193閲覧

Flaskでcsrf = CSRFProtect()が必要になる条件が知りたい

baboo

総合スコア8

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/02/06 07:18

編集2021/02/06 07:34

#質問したいこと
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トークンがないとリクエストが受理されないようになっているのでしょうか?
お知恵お借りできますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FiroProchainezo

2021/02/08 02:22

ちょっと理解できませんでした。 挙動について確認したいなら、動作する最小のコードを提示ください。(現在定時されているコードは実行できません。Webのコードの場合は、HTMLやあればJavaScriptも記載ください) 「行っていなかった」「FieldListを利用した際には」など色々書いてありますが、どのような状態なのか理解できません。 実行できる最小のコードを、例えばAのように実行して、Aのようにアクセスして、AにA'を入力した時に現象Aになるが、 Bの様に実行して、Bのようにアクセスして、BにB'を入力した時、現象Bになり、 ○○の挙動が違う、なぜか? などのように記載していただくと分かり安いと思います。 Aのように実行しての部分は例えば`python3 app.py`なのか`(色々設定したあとに)flask run`なのか暗いだと思います。 そのあと、ブラウザからどのURLにアクセスし、フォームのどこに何を入れて、どのボタンを押した、というのが分からないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問