Flask-WTFなるものがWebフォームのrequestとかを快適にしてくれるらしい。
快適ポイント一つ目:セッション情報を暗号化することでCross-Site Request Forgery(CSRF)攻撃から守ってくれる機能がある。
使い方の「例」としてhello.pyの中にapp.config[‘SECRET_KEY’] = ‘むつかしい文字列を入れる’を入力するのですが、直接hello.pyの中に入れるのは危険なのでconfig.pyというファイルの中にKeyを書くらしいです。
import os
secret_key = os.environ.get('SECRET_KEY')
的な感じで…。
とりあえず、いったん置いておいてForm Classに進みましょう。
flask-wtfをインストールして
> conda install -c anaconda flask-wtf
hello.pyに
from flask_wtf import Form
from wtforms import StringField, SubmitField
from wtforms.validators import Required
と
class NameForm(Form):
name = StringField('What is your name?', validators=[Required()])
submit = SubmitField('Submit')
を足します。
ここでNameFormクラスは
・文字列を入力する(type=”text”&<input>)StringField
・入力内容を登録する(type=”submit”&<input>)SubmitField
の両方を利用しています。
validators=[Required()]はフォームの中身がから出ない事を確認します。
その他、こんな感じでWTFフォームがあります。
詳しくは公式ページまで
んでhello.pyのindex関数をこんな感じに書き換えます。
@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)
・methodはrouteデコレーターにGETとPOSTを使うよ~と伝えています。もしmethodを書かないとGETだけを認識します。
・ユーザーindexに最初アクセスしたときは名前のデータがないので’Hello, Stranger!’を返します。
・もし、名前を入力すれば、’Hello, 名前!’が表示されます。
リダイレクトとセッション
名前を入力しsubmitボタンを押した後、ページ自体を更新するとエラーメッセージのポップアップが出てきます。
通常のWebアプリケーションの場合は、セッションを保存して対応します。
=>本当はここでいつぞや出たSECRET_KEYをセッションに使うらしい。
from flask import Flask, render_template, session, redirect, url_for
@app.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
if form.validate_on_submit():
session['name'] = form.name.data
return redirect(url_for('index'))
return render_template('index.html', form=form, name=session.get('name'))
・session[‘name’]で名前を一時的に記憶して、更新しても名前が一緒なのでindexページを表示します。
・もしsession[‘name’] = form.name.dataでないなら、新しく入力された名前を表示します。
さらに、indexをこんな感じに変更して、
from flask import Flask, render_template, session, redirect, url_for, flash
@app.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
if form.validate_on_submit():
old_name = session.get('name')
if old_name is not None and old_name != form.name.data:
flash('Looks like you have changed your name!')
session['name'] = form.name.data
form.name.data = ''
return redirect(url_for('index'))
return render_template('index.html', form = form, name = session.get('name'))
そしてbase.htmlのblock contentの中身を以下のように更新すると
{% block content %}
<div class="container">
{% for message in get_flashed_messages() %}
<div class="alert alert-warning">
<button type="button" class="close" data-dismiss="alert">×</button>
{{ message }}
</div>
{% endfor %}
{% block page_content %}{% endblock %}
</div>
{% endblock %}
名前変えたな~というメッセージが出てきます。
ここではBootstrapのalert CSSのスタイルの警告文を利用しています。
この警告文は名前を変更するたびに表示されますが、Webページを更新すると表示されません。
前回の記事はこちら
次回の記事はこちら