Flask実践|Blueprintでアプリを機能分割する方法【チャプター7-02】

ながみえ

一つ前のページではおみくじアプリを作成しました。

今回は Blueprint について見ていきましょう。

Chapter1:Flask入門編
Chapter2:Jinja2入門編
Chapter3:フィルター編
Chapter4:フォーム編
Chapter5:データベース編
Chapter6:エラーハンドリングとデバッグ編
Chapter7:アプリ開発編

 ・Chapter7-1:おみくじアプリを作ろう
 ・Chapter7-2:Blueprintを使おう ◁今回はここ
 ・Chapter7-3:メモ帳アプリを作ろう
 ・Chapter7-4:ToDoアプリを作ろう

Flaskでアプリケーションを作っていく際、最初は1つのファイル(たとえば app.py)の中にすべての処理を書いても問題ありません。

しかし、機能が増えてくるとどうしてもコードが長くなり、どこにどの処理が書かれているのか分かりづらくなってしまいます。

さらに、複数人で開発をする場合や、機能ごとにチームが分かれているような場合は、1つのファイルで作業するのは非常に非効率です。

このような課題を解決するために登場するのが Blueprint(ブループリント) です。

Blueprintを使うことで、Flaskアプリを「機能ごとにファイル単位で分割」することができ、次のようなメリットがあります。

  • 機能ごとにコードを整理できる(可読性・保守性アップ)
  • 複数人での同時開発がしやすくなる
  • 中~大規模なアプリにも対応しやすくなる

今回はこのBlueprintの基本的な使い方を学びます。

本記事は 有料記事(100円)ですが、現在は期間限定で無料公開中です。

<<前のページ

Flaskの記事一覧

次のページ>>

Blueprintとは?機能分割に使うFlaskの設計図

まずは「Blueprintとは何か」について見ていきましょう。

【Python】勉強猫がノートパソコンを前にして学習を始める様子。記事内の学習スタート用イラスト

FlaskでのBlueprintの定義と基本概念

Blueprint(ブループリント) とは、直訳すると「設計図」という意味です。

Flaskにおいてもこの意味はそのまま使われていて、「アプリケーションを機能単位で分割して、それぞれに独立した設計図を与える」ための仕組みです。

Blueprintを使うことで、1つの巨大なアプリケーションファイル(app.pyなど)を、次のように複数のモジュールに分割できます:

  • 認証機能 → auth/views.py
  • 管理画面 → admin/views.py
  • ユーザー処理 → user/views.py

こうすることで、1つのアプリケーションを「小さなアプリの集まり」として組み立てられるようになります。

FlaskアプリにおけるBlueprintの具体的な効果

BlueprintはFlaskアプリにとって、次のような役割を持ちます。

役割内容
モジュール分割コードを機能ごとに分けて整理できる
再利用性別のアプリにも同じ機能を簡単に組み込める
チーム開発各メンバーが独立して処理を担当できる
URL管理URLの接頭辞(プレフィックス)を使って、機能ごとにURLを整理できる

Flask Blueprintの導入手順【3ステップで解説】

BlueprintをFlaskアプリで使うには、次の3つのステップを踏む必要があります。

FlaskでBlueprintオブジェクトを作成

Blueprintを使うにはまず専用のオブジェクトを生成します。

これは Blueprint()関数 を使って作成されます。

このオブジェクトは、後のルーティング定義やテンプレート呼び出しなどに使われます。

Blueprintでルーティングを設定

生成したBlueprintオブジェクトに対して、 @オブジェクト名.route() という形でルーティングを定義します。

通常の @app.route() とほとんど同じ感覚で記述できますが、BlueprintではURLの接頭辞(prefix)を設定することができます。

あわせて読みたい
Flask入門|ルーティングを理解しよう【チャプター1-04】
Flask入門|ルーティングを理解しよう【チャプター1-04】

FlaskアプリにBlueprintを登録

最後に、作成したBlueprintをFlaskアプリケーションの中で使えるように登録します。

これは app.register_blueprint() という関数を使います。

これによりBlueprint内で定義したルーティングや処理が、アプリ全体から利用できるようになります。

この3ステップは、FlaskでBlueprintを扱う上での基本中の基本です。

【Python】勉強猫がノートパソコンを見ながら考え込む様子。記事内の休憩用イラスト

Flask Blueprintの実装コードを詳しく解説

ここからは実際のコードを使ってBlueprintの使い方を3つのステップに分けて丁寧に解説していきます。

FlaskアプリをBlueprintで整理する構成例

これから9個のコードを紹介します。それらのコードを以下のような階層になるよう保存してください。

先にフォルダだけ作っておくとスムーズに作業できます。

flask_app/
│
├── app.py                   ← アプリケーションの起動ファイル
│
├── application/
│   ├── one/
│   │   └── views1.py       ← Aさん用のBlueprint処理
│   └── two/
│       └── views2.py       ← Bさん用のBlueprint処理
│
├── static/
│   ├── style1.css          ← Aさん用のスタイル
│   └── style2.css          ← Bさん用のスタイル
│
└── templates/
    ├── base.html           ← 全ページ共通のテンプレート
    ├── top.html			← トップページ
    ├── one/
    │   └── index1.html		← Aさんの機能ページ
    └── two/
        └── index2.html		← Bさんの機能ページ

Blueprint用viewsファイルのコード構成

まずは、機能ごとに分けた2つのファイル views1.pyviews2.py を見てみましょう。

from flask import Blueprint, render_template

# --- Blueprintの定義 ---
one_bp = Blueprint('one_app', __name__, url_prefix='/one')
    # one_appという名のBlueprintインスタンスを生成し、変数one_bpに代入

# --- ルーティング ---
@one_bp.route('/')
def show_template():
    return render_template('one/index1.html')
  • Blueprint('one_app', __name__, url_prefix='/one')
    → 第1引数 'one_app' はこのBlueprintの内部名(URL生成時に使用)。
    → 第2引数 __name__ は現在のモジュール名(Flaskに必要)。
    url_prefix='/one' によって、このBlueprintのルーティングは /one/ から始まります。
  • @one_bp.route('/')
    → 実際のURLは /one/ になります。
  • render_template('one/index1.html')
    → テンプレートフォルダ内の one/index1.html を表示します。
from flask import Blueprint, render_template

# --- Blueprintの定義 ---
two_bp = Blueprint('two_app', __name__, url_prefix='/two')
    # two_appという名のBlueprintインスタンスを生成し、変数two_bpに代入

# --- ルーティング ---
@two_bp.route('/')
def show_template():
    return render_template('two/index2.html')
  • 構造は views1.py と全く同じですが、名前とプレフィックスが異なります。
  • このBlueprintのルートは /two/ になります。
  • 対応するテンプレートは two/index2.html です。
あわせて読みたい
Flask入門|render_template関数を理解しよう【チャプター2-04】
Flask入門|render_template関数を理解しよう【チャプター2-04】

app.pyにBlueprintを登録

次はBlueprintを実際のアプリケーションに登録する app.py を確認します。

from flask import Flask, render_template
app = Flask(__name__)

# --- Blueprintの登録 ---
from application.one.views1 import one_bp
app.register_blueprint(one_bp)

from application.two.views2 import two_bp
app.register_blueprint(two_bp)

# --- ルーティング ---
@app.route('/')
def show_top():
    return render_template('top.html')

# --- 実行 ---
if __name__ == '__main__':
    app.run()
  • from application.one.views1 import one_bp
    views1.py で定義したBlueprintをインポートします。
  • app.register_blueprint(one_bp)
    → それをアプリに登録します。これで /one/ にアクセスできるようになります。
  • 同様に two_bp も登録され、/two/ にアクセス可能になります。
  • トップページ / にアクセスすると top.html が表示されます。

トップページでは、それぞれの機能ページへのリンクが用意されています。

{% extends "base.html"%}

{% block content %}
    <h1>Topページ</h1>
    <a href="{{url_for('one_app.show_template')}}">Aさんが作った機能</a>
    <br>
    <a href="{{url_for('two_app.show_template')}}">Bさんが作った機能</a>
{% endblock %}

ここで使用されている url_for('one_app.show_template') という記述は、Blueprint名 one_app と関数名 show_template を組み合わせた指定方法です。

Blueprintを使うことで、関数名の衝突を防ぎつつ、明示的なルーティングができるようになります。

あわせて読みたい
Flask入門|url_for関数で動的リンクを生成する方法をやさしく解説【チャプター2-03】
Flask入門|url_for関数で動的リンクを生成する方法をやさしく解説【チャプター2-03】

各機能ごとのテンプレートとスタイル定義

Blueprintで分けた各機能には、それぞれ独自のテンプレートとスタイルが用意されています。

ここでは、以下のファイルの役割と構造について解説します。

  • templates/base.html(全ページ共通)
  • templates/one/index1.html(Aさんのページ)
  • templates/two/index2.html(Bさんのページ)
  • static/style1.css(Aさん用スタイル)
  • static/style2.css(Bさん用スタイル)

base.html(共通テンプレート)

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Flask-Blueprint</title>
    {% block style %}{% endblock %}
</head>
<body>
    {% block content %}内容{% endblock %}
</body>
</html>
  • すべてのページの土台となるHTMLです。
  • {% block style %}{% block content %} の2か所に「上書き可能なブロック」を用意しています。
  • 他のテンプレートでこのテンプレートを拡張し、それぞれの内容を埋め込みます。
あわせて読みたい
Flask入門|テンプレートの継承を理解しよう【チャプター2-02】
Flask入門|テンプレートの継承を理解しよう【チャプター2-02】

index1.html(Aさんのページ)

{% extends "base.html" %}

{% block style %}
    <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style1.css') }}">
{% endblock %}

{% block content %}
    <h1>Aさんが作った機能</h1>
    <a href="{{ url_for('show_top') }}">Topへ戻る</a>
{% endblock %}
  • base.html を継承しています({% extends "base.html" %})。
  • {% block style %}style1.css を読み込むことで、文字色を赤に変更。
  • {% block content %} 内にAさんのメッセージと「トップへ戻る」リンクを配置。

index2.html(Bさんのページ)

{% extends "base.html" %}

{% block style %}
    <link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='style2.css') }}">
{% endblock %}

{% block content %}
    <h1>Bさんが作った機能</h1>
    <a href="{{ url_for('show_top') }}">Topへ戻る</a>
{% endblock %}
  • Aさんのページと同じ構造ですが、style2.css を使ってスタイルを青色に変更しています。
  • ページのタイトル部分だけが異なり、それ以外の構造は共通。

style1.cssstyle1.css

h1 {color:red;}
h1 {color:Blue;}
  • 見た目に変化を付けるために、Aさんのページは赤、Bさんのページは青と色分けしています。
  • FlaskのテンプレートでこれらのCSSを切り替えることで、同じHTML構造でも違う見た目を演出できます。

Flask Blueprintの導入効果と次回予告まとめ

コードを実際に動かしてみましたか?

Blueprintを活用して「機能ごとに分割して開発」するイメージが付いたかと思います。

Flaskの基本を身につけたばかりの方にとっては、いきなりファイルを複数に分けたり、モジュールとして機能を構成したりすることに戸惑いがあるかもしれません。

しかし、実際のアプリ開発では避けて通れない重要な技術です。

学習項目内容
BlueprintとはFlaskアプリケーションを「機能単位」で分けるための“設計図”
ステップ1Blueprint() を使ってオブジェクトを生成し、プレフィックス付きで管理
ステップ2@オブジェクト.route() を使ってルーティングを定義
ステップ3app.register_blueprint() でFlaskアプリに登録して機能を有効化
ファイル分割viewsファイル、HTMLテンプレート、CSSファイルをフォルダ単位で整理
URLとテンプレートの連携/one//two/ などのURLに応じてテンプレートやスタイルを切り替え

Blueprintを使うことで、アプリケーションをモジュール化し、見通しのよい構成とチーム開発に強い設計を実現できます。

また、個人開発においても、機能を分けて管理することで後からの機能追加や修正がしやすくなります。

次回は、今回学んだ Blueprint の知識を活用して、「メモ帳アプリ」を作っていきます。

「Blueprintをどう活かせば現実的なアプリを作れるのか?」という疑問に、具体的な形で答えを示していきます。

もっと分かりやすい学習サイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいFlask学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

Flaskの記事一覧

次のページ>>

FAQ|Flask Blueprintの使い方と構成方法

Q
Q1. Blueprintは必ず使わなければいけませんか?

小規模なアプリでは不要な場合もありますが、機能が増える中〜大規模な開発やチーム開発では、Blueprintを使うことでコードの見通しが良くなり、保守性が大きく向上します。

Q
Q2. Blueprintのurl_prefixは省略できますか?

はい、省略可能です。ただし、URLの整理や機能ごとのルーティングを明確にしたい場合は、prefixを付けるのが一般的でおすすめです。

Q
Q3. 複数のBlueprintから同じテンプレートを呼び出しても問題ありませんか?

問題ありません。ただし、テンプレート内のスタイルやパスの衝突に注意し、テンプレート名の命名規則やディレクトリ構成を工夫するのがポイントです。

記事URLをコピーしました