ラズパイデスクトップでFlask入門(6)Blueprint and Views(2)The First View:Register
こんばんは。國松です。
あけましておめでとうございます。本年もどうぞよろしくお願い致します。
Flaskのチュートリアルが中々終わりませんが少しづつ進めて行きたいと思います。
Flaskのサイト
Welcome to Flask (英語版)
Flaskへようこそ (日本語版)(このサイトのチュートリアルは上記英語版とは異なるので注意して下さい)
The First View:Register
ユーザが/auth/registerのURLにアクセスするとauth Viewは入力用のフォームを含むHTMLを返します。フォームを送信すると入力う内容を検証しエラーメッセージを表示してフォームを再表示するか新しいユーザーを作成してログインペーに移動します。
まずViewコードを作成して次のセクションでHTMLフォームを生成するためのテンプレートを作成していきます。
以下のコードをauth.pyに追記します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | @bp.route('/register', methods=('GET', 'POST')) def register(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] db = get_db() error = None if not username: error = 'Username is required.' elif not password: error = 'Password is required.' elif db.execute( 'SELECT id FROM user WHERE username = ?', (username,) ).fetchone() is not None: error = 'User {} is already registered.'.format(username) if error is None: db.execute( 'INSERT INTO user (username, password) VALUES (?, ?)', (username, generate_password_hash(password)) ) db.commit() return redirect(url_for('auth.login')) flash(error) return render_template('auth/register.html') |
登録(register)Viewの機能
1.@bp.routeはURL/registerをViewの登録機能に関連付けます。
Flaskは/auth/registerへのリクエストを受け取ると登録ビューを呼び出して、戻り値を応答として受け取ります。
Flaskのルーティングについて
ルーティングとはURLと処理を対応付けることですFlaskのルーティングはURLとfunctionを紐づけます。ルーティングにはroute()メソッドを用います。
HTTPメソッドに応じたルーティング
route()はHTTPメソッド名のリストを渡す事でそのURLが受け入れるHTTPメソッドを指定できます。
@app.route(‘/edit’,methods=[‘GET’,’POST’])
def edit():
# 共通の処理
if request.method == ‘get’:
#GETの処理
else
#POSTの処理
#共通の処理
その他のルーティングについて詳しくは以下のサイトが参考になります。
いまさらながらFlaskについてまとめる ~Routing~
2.ユーザーがフォームを送信した場合request.methodは’POST’になります。この場合、入力の検証を開始します。
3.request.formは送信されたフォームのキーと値をマッピングする特別な種類のdictionaryです。ユーザーはユーザー名とパスワードを入力します。
4.ユーザー名とパスワードが空でないことを検証します。
5.データベースを照会し、結果が返されるどうかを確認する事でユーザー名がまだ登録されていないことを検証します。
db.executeはSQLクエリをうけとりますがユーザー入力用のプレースホルダー、及びプレースホルダーを置き換えるためのタプル、データベースライブラリは値のエスケープを処理するためSQLインジェクション攻撃に脆弱ではありません。
fetchone()はクエリから1行を消します。クエリが結果を返さなかった場合Noneを返します。
その後fetchall()使用されすべての結果のリストが返されます。
6.検証が成功したら新しいユーザーをデータベースに挿入します。セキュリティー上の理由からパスワードを直接データベースに格納しません。代わりにgenerate_password_hash()を使用してパスワードを安全にハッシュ化しそのハッシュが格納されます。
このクエリはデータを変更するためにdb.commit()を呼び出す必要があります。
7.ユーザーを保存するとログインページにリダイレクトされます。
url_for()はその名前に基づいてログインビューのURLを生成します。
redirect()は生成されたURLへのリダイレクト応答を生成します。
8.検証が失敗するとエラーがユーザーに表示されます。flash()はテンプレートをレンダリングするときに取得できるメッセージを保存します。
Flaskでフラッシュメッセージを表示する方法
9.ユーザーが最初にauth/registerに移動したとき,または検証エラーがあったとき、登録フォームを含むHTMLページが表示されます。
render_template()はHTMLを含むテンプレートをレンダリングします。
長々と登録ビューの説明が続いてしまいました。今回はここまでにしたいと思います。次回はLoginとLogoutビューを作成していきます。