はじめに
ここでは、Flaskのアプリケーション関連設定について解説します。
ビュー関数
ここでは例として、ユーザー認証の機能を例に書きます。
auth.py
import functools
from flask import (
Blueprint, flash, g, redirect, render_template, request, session, url_for
)
from werkzeug.security import check_password_hash, generate_password_hash
from todo.db import get_db
bp = Blueprint('auth', __name__, url_prefix='/auth')
@bp.route('/signup', methods=('GET', 'POST'))
def signup():
error = {}
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
password_re = request.form['password-re']
db = get_db()
if not username:
error['username'] = 'ユーザー名を入力してください。'
if not password:
error['password'] = 'パスワードを入力してください。'
if not password_re:
error['password_re'] = 'パスワード(確認用)を入力してください。'
if username and password and password_re:
if password == password_re:
registered_user = db.execute(
'SELECT id FROM user WHERE username=?', (username,)
).fetchone()
if registered_user is not None:
error['username'] = 'そのユーザー名は既に登録されています。'
else:
error['password_re'] = 'パスワードが一致していません。'
if error == {}:
db.execute(
'INSERT INTO user (username, password) VALUES (?, ?)',
(username, generate_password_hash(password))
)
db.commit()
return redirect(url_for('auth.login'))
return render_template(
'auth/form.html',
type='signup',
error=error
)
@bp.route('/login', methods=('GET', 'POST'))
def login():
error = None
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
db = get_db()
user = db.execute(
'SELECT * FROM user WHERE username = ?', (username,)
).fetchone()
if user is None or not check_password_hash(user['password'], password):
error = 'ユーザー名かパスワードが間違っています。'
if error is None:
session.clear()
session['user_id'] = user['id']
return redirect(url_for('index'))
return render_template(
'auth/form.html',
type='login',
error=error
)
@bp.before_app_request
def load_logged_in_user():
user_id = session.get('user_id')
if user_id is None:
g.user = None
else:
g.user = get_db().execute(
'SELECT * FROM user WHERE id = ?', (user_id,)
).fetchone()
@bp.route('/logout')
def logout():
session.clear()
return redirect(url_for('auth.login'))
def login_required(view):
@functools.wraps(view)
def wrapped_view(**kwargs):
if g.user is None:
return redirect(url_for('auth.login'))
return view(**kwargs)
return wrapped_view
まとめ
ここでは、Flaskのアプリケーションの設定の基本について解説しました。
次回はHTMLテンプレートについて取り上げる予定です。