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

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

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

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

CSRF

クロスサイトリクエストフォージェリ (Cross site request forgeries、CSRF)は、 外部Webページから、HTTPリクエストによって、 Webサイトの機能の一部が実行されてしまうWWWにおける攻撃手法です。

Python

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

Q&A

解決済

1回答

2112閲覧

wtformsにdefaultの値を入れるとvalidationが通らない

Satokn

総合スコア5

Flask

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

CSRF

クロスサイトリクエストフォージェリ (Cross site request forgeries、CSRF)は、 外部Webページから、HTTPリクエストによって、 Webサイトの機能の一部が実行されてしまうWWWにおける攻撃手法です。

Python

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

0グッド

0クリップ

投稿2019/12/26 13:31

前提・実現したいこと

Flaskでwebアプリケーションを作っています。
wtformsを使いdefaultの設定をして、既存のデータを編集するformを作りたいです。

発生している問題・エラーメッセージ

defaultの値を設定することはできたのですが、編集後のvalidateが通りません。
flaskのloggerを使ってform.errorsを出力しています

'csrf_token': ['The CSRF token is missing.']

該当のソースコード

現象を再現する最小限のソースコードです。

python

1from flask import Flask, render_template 2from flask_wtf import FlaskForm 3from wtforms.fields import StringField, SubmitField 4 5app = Flask(__name__) 6 7app.config.update( 8 DEBUG = True, 9 SECRET_KEY = 'you_will_never_guess' 10) 11 12 13#default value 14default_value ={ 15 "name" : "Taro", 16 "address" : "taro@example.com" 17} 18 19 20#form to set default value 21class MainForm(FlaskForm): 22 name = StringField("name") 23 address = StringField("address") 24 submit = SubmitField("submit") 25 26 27@app.route("/", methods=["GET", "POST"]) 28def main(): 29 form = MainForm() 30 31 keys = ["name", "address"] 32 for key in keys: 33 field = getattr(form, key) 34 value = default_value[key] 35 setattr(field, "default", value) 36 form.process() 37 38 if form.validate_on_submit(): 39 default_value["name"] = form.name.data 40 default_value["address"] = form.address.data 41 app.logger.debug(default_value) 42 43 app.logger.debug(form.errors) 44 return render_template("main.html", form=form) 45 46if __name__ == "__main__": 47 app.run()

html

1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6</head> 7<body> 8 <form action="/" method="POST"> 9 {{form.csrf_token}} 10 {{form.name.label}}{{form.name}}<br> 11 {{form.address.label}}{{form.address}}<br> 12 {{form.submit}} 13 </form> 14</body> 15</html>

試したこと

htmlファイルの{{form.csrf_token}}{{form.csrf_token()}}{{form.hidden_tag()}}に変えてみましたが状況は変わりませんでした。
form.csrf_tokenにもデフォルトの値を入れてみましたがThe CSRF token is invalidと出力されました。

補足情報(FW/ツールのバージョンなど)

Flask 1.1.1
Flask-WTF 0.14.2
WTForms 2.2.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

これが足りないんじゃないかと思います。

python

1csrf = CSRFProtect() 2csrf.init_app(app)

あと、以下もあったほうが良いかもしれません。

python

1 # 要、from flask import request 2 if request.method == 'POST': 3 if form.validate_on_submit(): 4 default_value["name"] = form.name.data 5 default_value["address"] = form.address.data 6 app.logger.debug(default_value)

投稿2019/12/27 00:25

FiroProchainezo

総合スコア2387

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

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

Satokn

2019/12/27 04:56

無事解決できました。ありがとうございました。 default値を入れない場合、CSRFProtectがなくてもvalidateが通っていたのでいらないものだと勘違いしておりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問