はじめに
この実験では、Flask のブループリントを作成して使用し、ビューを使ってアプリケーションを構造化する方法を学びます。Flask のブループリントを使うことで、関連するビュー、コード、リソースをまとめることができ、アプリケーションをモジュール化して拡張性の高いものにすることができます。ここでは、ユーザー認証とブログ投稿機能を含む簡単なアプリケーションを作成します。
注:コードファイルは自分で作成し、環境で実行する必要があります。Web 5000 で Flask サービスの状態をプレビューできます。
ブループリントを作成する
まず、アプリケーション用のブループリントを作成しましょう。このブループリントは「auth」と名付けられ、ユーザー認証に関連するビューを処理します。ブループリントは、flaskr/auth.py という別のモジュールで定義します。
## flaskr/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 flaskr.db import get_db
## 「auth」という名前のブループリントを作成する
bp = Blueprint('auth', __name__, url_prefix='/auth')
ブループリントを登録する
ブループリントを作成した後、アプリケーションに登録する必要があります。これは、flaskr/__init__.py のアプリケーションファクトリ関数で行われます。
## flaskr/__init__.py
def create_app():
app =...
## 既存のコードは省略
## ブループリントをインポートして登録する
from. import auth
app.register_blueprint(auth.bp)
return app
登録ビューを実装する
次に、flaskr/auth.py に登録ビューを実装しましょう。このビューは登録フォームを表示し、フォームの送信を処理します。
## flaskr/auth.py
@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 = 'ユーザー名は必須です。'
elif not password:
error = 'パスワードは必須です。'
if error is None:
try:
db.execute(
"INSERT INTO user (username, password) VALUES (?,?)",
(username, generate_password_hash(password)),
)
db.commit()
except db.IntegrityError:
error = f"ユーザー {username} は既に登録されています。"
else:
return redirect(url_for("auth.login"))
flash(error)
return render_template('auth/register.html')
ログインビューを実装する
次に、flaskr/auth.py にログインビューを実装します。このビューはユーザーのログイン機能を処理します。
## flaskr/auth.py
@bp.route('/login', methods=('GET', 'POST'))
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
db = get_db()
error = None
user = db.execute(
'SELECT * FROM user WHERE username =?', (username,)
).fetchone()
if user is None:
error = 'ユーザー名が間違っています。'
elif not check_password_hash(user['password'], password):
error = 'パスワードが間違っています。'
if error is None:
session.clear()
session['user_id'] = user['id']
return redirect(url_for('index'))
flash(error)
return render_template('auth/login.html')
ログアウトビューを実装する
次に、flaskr/auth.py にログアウトビューを追加しましょう。このビューはユーザーのログアウト機能を処理します。
## flaskr/auth.py
@bp.route('/logout')
def logout():
session.clear()
return redirect(url_for('index'))
ログインが必要なデコレータを実装する
ユーザーがログインしていることが必要なビューを保護するために、デコレータも必要になります。このデコレータは flaskr/auth.py に実装されます。
## flaskr/auth.py
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 のブループリントを使ってアプリケーションを構造化する方法を学びました。ユーザー認証用のブループリントを作成し、登録、ログイン、ログアウトビューを実装しました。また、ユーザーがログインしていることが必要なビューを保護するためのデコレータも実装しました。この知識を使えば、Flask アプリケーションをモジュラーかつ拡張可能な方法で構造化できるようになりました。