見出し画像

Flask Web Development P37~41

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">&times;</button>
{{ message }}
</div>
{% endfor %}
{% block page_content %}{% endblock %}
</div>
{% endblock %}

名前変えたな~というメッセージが出てきます。
ここではBootstrapのalert CSSのスタイルの警告文を利用しています。
この警告文は名前を変更するたびに表示されますが、Webページを更新すると表示されません。


この記事が気に入ったらサポートをしてみませんか?