【Python特化】おすすめのオンラインプログラミングスクール

【Flask】Blueprintとは?使い方と実装方法を解説

flask-blueprint
本記事の要点
  • FlaskにおけるBlueprintの機能を理解する
  • Blueprintの特徴と利用方法を理解する
  • app.register_blueprint()関数を理解する

上記をまとめ、具体的なコードやBlueprintの使い方を重点的に解説します。

目次

Blueprintとは

Blueprintとは、アプリケーションを分割するためのFlaskの拡張機能です。

Blueprintを利用すると、アプリケーション全体が大規模になっても簡潔な状態を保ち、アプリの保守性が向上します。

また、アプリを分割しているため1ファイルにおけるコードの可読性も高めます。

Blueprintのメリット
  • アプリケーション全体の保守性向上
  • 1ファイルにおけるコードの可読性向上

ディレクトリ構成が可視化しやすいため、開発効率も高まるメリットがあります。

Blueprintの特徴

FlaskにおけるBlueprintは、次のような特徴があります。

Blueprintの特徴
  • アプリケーションを分割できる
  • url_prefix, subdomainを指定しアプリケーションルートを区別できる
  • Blueprint単位でテンプレートを分けられる
  • Blueprint単位で静的ファイルを分けられる

Blueprintの利用方法(生成例)

以下は、Blueprintオブジェクトの生成例です。

from flask import Blueprint

'''
template_folderとstatic_folderを指定しない場合は、
Blueprintアプリ用のテンプレートと静的ファイルは利用できない
'''

sample = Blueprint(
    __name__,
    "sample",
    template_folder = "templates",
    static_folder = "static",
    url_prefix = "/sample",
    subdomain = "sample",
)

以下は、Blueprintクラスの主なコンストラクタです。

スクロールできます
引数説明
nameBlueprintアプリの名前。各エンドポイント名の前に追加される。
import_nameBlueprintアプリのパッケージの名前。通常は__name__を指定する。
template_folderBlueprintアプリのテンプレート用ディレクトリ。デフォルトで無効。Blueprintのテンプレートは青¥プリ本体のテンプレートより優先度が低い。
static_folderBlueprintアプリの静的ファイル用ディレクトリ。デフォルトで無効。
url_prefixBlueprintアプリの全URLの先頭に追加し、他のアプリルートと区別するパス。
subdomainBlueprintをサブドメインとして利用する場合に指定する。
Blueprintクラスの代表的なコンストラクタ

また、生成したBlueprintオブジェクトは、次のようにregister_blueprint関数でappに登録します。

app.register_blueprint(sample, url_prefix="/sample", subdomain="sample")

以下は、register_blueprintの代表的な引数です。

スクロールできます
引数説明
blueprint登録するBlueprintアプリ。Blueprintクラスのオブジェクトを指定する。
url_prefixBlueprintアプリの全URLの先頭に追加し、他のアプリルートと区別するパス。
subdomainBlueprintをサブドメインとして利用する場合に指定する。
register_blueprintの代表的な引数

Blueprintクラスとregister_blueprint関数で指定したパラメータが重複した場合、regoster_blueprint関数の値が優先されます。

複数のBlueprintにおけるテンプレート利用の注意点

複数のBlueprintが同じ相対テンプレートパスを利用する場合、最初に登録したBlueprintのテンプレートが優先されます。

そのため、他のBlueprintのテンプレートを作成しても2つ目以降のテンプレートが表示できなくなります。

上記を回避するには、templatesディレクトリとHTMLファイルの間にBlueprintで登録したアプリ名のディレクトリを挟む必要があります。

以下は、Blueprintを考慮したディレクトリ構成の例になります。

flask-project
├── .env
├── apps
│   ├── app.py
│   ├── config.py
│   ├── static
│   │   └── bootstrap.min.css
│   ├── auth ← blueprintアプリ
│   │   ├── __init__.py
│   │   ├── forms.py
│   │   ├── models.py
│   │   ├── static/css
│   │   │   └── style.css
│   │   ├── templates
│   │   │   └── auth ← ディレクトリを挟む
│   │   │       ├── base.html
│   │   │       ├── index.html
│   │   │       ├── login.html
│   │   │       └── signup.html
│   │   └── views.py
│   └── todo ← blueprintアプリ
│       ├── __init__.py
│       ├── forms.py
│       ├── models.py
│       ├── static
│       │   └── style.css
│       ├── templates
│       │   └── todo ← ディレクトリを挟む
│       │       ├── base.html
│       │       ├── index.html
│       │       ├── todo_create.html
│       │       ├── todo_edit.html
│       │       ├── todo_done.html
│       │       └── todo_delete.html
│       └── views.py
├── local.sqlite
└── migrations

templatesとHTMLファイルの間にアプリ名のディレクトリを挟むことで明示的にパスを分け、Flaskが解釈できるよう構成します。

Blueprintとapp.register_blueprintの具体例

ここでは、上述した内容を具体例で示しながら解説します。

また、以下のBlueprintアプリによるディレクトリ構成で進めていきます。

app.py, 各Blueprintアプリのviews.pyを中心に解説します。

flask-project
├── .env
├── apps
│   ├── app.py
│   ├── config.py
│   ├── static
│   │   └── bootstrap.min.css
│   ├── auth
│   │   ├── __init__.py
│   │   ├── forms.py
│   │   ├── models.py
│   │   ├── static/css
│   │   │   └── style.css
│   │   ├── templates
│   │   │   └── auth
│   │   │       ├── base.html
│   │   │       ├── index.html
│   │   │       ├── login.html
│   │   │       └── signup.html
│   │   └── views.py
│   └── todo
│       ├── __init__.py
│       ├── forms.py
│       ├── models.py
│       ├── static
│       │   └── style.css
│       ├── templates
│       │   └── todo
│       │       ├── base.html
│       │       ├── index.html
│       │       ├── todo_create.html
│       │       ├── todo_edit.html
│       │       ├── todo_done.html
│       │       └── todo_delete.html
│       └── views.py
├── local.sqlite
└── migrations

また、Blueprintアプリ登録までの流れは以下の通りです。

Blueprintアプリ登録までの流れ
  • Blueprintのインポート
  • Blueprintオブジェクトを作成
  • app.register_blueprint()関数でアプリを登録

Blueprintのインポート

Flaskの機能であるBlueprintのインポートは以下になります。

from flask import Blueprint
from flask import Blueprint

ここでは、認証アプリとToDoアプリを分割して作成しているため、各アプリでBlueprintをインポートしています。

Blueprintオブジェクトを作成

次に、Blueprintオブジェクトを作成します。

from flask import Blueprint

# Blueprintでauthを作成する
auth = Blueprint(
    "auth",
    __name__,
    template_folder = "templates",
    static_folder = "static",
)
from flask import Blueprint

# Blueprintでtodoを作成する
todo = Blueprint(
    "todo",
    __name__,
    template_folder = "templates",
    static_folder = "static",
)

Blueprintオブジェクトを作成したら、app.register_blueprint()関数にてアプリを登録します。

app.register_blueprint()関数でアプリを登録

app.register_blueprint()関数でアプリを登録するため、app.pyにコードを追加します。

# ...省略...

def create_app(config_key):
    # Flaskインスタンス生成
    app = Flask(__name__)

    # ...省略...

    # authパッケージからviewsをインポート
    from apps.auth import views as auth_views
    # todoパッケージからviewsをインポート
    from apps.todo import views as todo_views

    # register_blueprintを利用してviewsのauthをアプリへ登録
    app.register_blueprint(auth_views.auth, url_prefix="/auth")
    # register_blueprintを利用してviewsのtodoをアプリへ登録
    app.register_blueprint(todo_views.todo, url_prefix="/todo")

    return app

Blueprintアプリをappに登録後、各URLにアクセスします。

また、/authへアクセスした場合にログインページに遷移する仕様にしています。

認証アプリの画面は以下になります。(URL:/auth)

ToDoアプリの画面は以下になります。(URL:/todo)

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

sugiのアバター sugi SUGI

【経歴】玉川大学工学部卒業→新卒SIer企業入社→2年半後に独立→プログラミングスクール運営/受託案件→フリーランスエンジニア&SEOコンサル→Python特化のコンテンツサイトJob Code運営中

コメント

コメントする

目次