Posted at

Flask-WTFとFlask-Bootstrapで、いい感じのFormを自動生成する

More than 1 year has passed since last update.

こちらの記事の続きです。

Flask-WTF: Formの入力項目のvalidationや、CSRF対策済みのFormを作るためのFlask拡張


インストール

$ pip install flask-wtf flask-bootstrap



Flask-WTFについて補足


  1. いい感じのFormが簡単に作れる(formのhtml生成 wtf.quick_form(form) 、validation form.validate_on_submit())


  2. CSRF対策が簡単にできる



CSRFとは:

リクエスト強要(CSRF:Cross-site Request Forgery)とは、別のサイトに用意したコンテンツ上の罠のリンクを踏ませること等をきっかけとして、インターネットショッピングの最終決済や退会等Webアプリケーションの重要な処理を呼び出すようユーザを誘導する攻撃である。

ブラウザが正規の Webコンテンツにアクセスした際には毎回、セッションを維持するために所定の Cookie、Basic認証データあるいは Digest認証データがブラウザから Webサーバ宛に送出されるという性質を、この攻撃は悪用する。

CSRF対策:

ユーザ本人以外の者が捏造したコンテンツに基づいて発せられたHTTPリクエストを Webアプリが受け付けないようにすること。

他者が推定困難なランダム値を フォームのhiddenフィールドとして埋め込み送信し、フォームを返信させる



簡単な使い方 (Flask-Bootstrapも利用)


app.py

from flask import Flask

app = Flask(__name__)
app.config['SECRET_KEY'] = 'super secret' # CSRF対策でtokenの生成に必要


Formを作る


app.py

from flask_wtf import FlaskForm

from wtforms import StringField, SubmitField
from wtforms.validators import Required

Class NameForm(FlaskForm):
name = StringField('name:', validators=[Required()])
submit = SubmitField('Submit')


Viewを作る


form.html

{% import "bootstrap/wtf.html" as wtf %}

{{ wtf.quick_form(form) }}

Form Handlingの例:


app.py

@app.route('/', methods=['GET', 'POST'])

def index():
name = None
form = NameForm()
if form.validate_on_submit():
name = form.name.data
form.name.data = ''
return render_template('index.html', form=form, name=name)