認証付きのモジュラーFlask アプリケーション

FlaskFlaskBeginner
今すぐ練習

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Flask のブループリントを作成して使用し、ビューを使ってアプリケーションを構造化する方法を学びます。Flask のブループリントを使うことで、関連するビュー、コード、リソースをまとめることができ、アプリケーションをモジュール化して拡張性の高いものにすることができます。ここでは、ユーザー認証とブログ投稿機能を含む簡単なアプリケーションを作成します。

注: コードファイルは自分で作成し、環境で実行する必要があります。Web 5000 で Flask サービスの状態をプレビューできます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL flask(("Flask")) -.-> flask/DataHandlingGroup(["Data Handling"]) flask(("Flask")) -.-> flask/CoreConceptsGroup(["Core Concepts"]) flask(("Flask")) -.-> flask/DevelopmentToolsGroup(["Development Tools"]) flask/DataHandlingGroup -.-> flask/incoming_request_data("Incoming Request Data") flask/CoreConceptsGroup -.-> flask/application_object("Application Object") flask/CoreConceptsGroup -.-> flask/session_interface("Session Interface") flask/CoreConceptsGroup -.-> flask/json_support("JSON Support") flask/CoreConceptsGroup -.-> flask/class_based_views("Class-Based Views") flask/CoreConceptsGroup -.-> flask/useful_internals("Useful Internals") flask/DevelopmentToolsGroup -.-> flask/blueprint_objects("Blueprint Objects") flask/DevelopmentToolsGroup -.-> flask/command_line_interface("Command Line Interface") subgraph Lab Skills flask/incoming_request_data -.-> lab-136337{{"認証付きのモジュラーFlask アプリケーション"}} flask/application_object -.-> lab-136337{{"認証付きのモジュラーFlask アプリケーション"}} flask/session_interface -.-> lab-136337{{"認証付きのモジュラーFlask アプリケーション"}} flask/json_support -.-> lab-136337{{"認証付きのモジュラーFlask アプリケーション"}} flask/class_based_views -.-> lab-136337{{"認証付きのモジュラーFlask アプリケーション"}} flask/useful_internals -.-> lab-136337{{"認証付きのモジュラーFlask アプリケーション"}} flask/blueprint_objects -.-> lab-136337{{"認証付きのモジュラーFlask アプリケーション"}} flask/command_line_interface -.-> lab-136337{{"認証付きのモジュラーFlask アプリケーション"}} end

ブループリントを作成する

まず、アプリケーション用のブループリントを作成しましょう。このブループリントは「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 アプリケーションをモジュラーかつ拡張可能な方法で構造化できるようになりました。