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円)ですが、現在は期間限定で無料公開中です。
Blueprintとは?機能分割に使うFlaskの設計図
まずは「Blueprintとは何か」について見ていきましょう。
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アプリにBlueprintを登録
最後に、作成したBlueprintをFlaskアプリケーションの中で使えるように登録します。
これは app.register_blueprint()
という関数を使います。
これによりBlueprint内で定義したルーティングや処理が、アプリ全体から利用できるようになります。
この3ステップは、FlaskでBlueprintを扱う上での基本中の基本です。
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.py
と views2.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
です。
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を使うことで、関数名の衝突を防ぎつつ、明示的なルーティングができるようになります。
各機能ごとのテンプレートとスタイル定義
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か所に「上書き可能なブロック」を用意しています。- 他のテンプレートでこのテンプレートを拡張し、それぞれの内容を埋め込みます。
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.css
と style1.css
h1 {color:red;}
h1 {color:Blue;}
- 見た目に変化を付けるために、Aさんのページは赤、Bさんのページは青と色分けしています。
- FlaskのテンプレートでこれらのCSSを切り替えることで、同じHTML構造でも違う見た目を演出できます。
Flask Blueprintの導入効果と次回予告まとめ
コードを実際に動かしてみましたか?
Blueprintを活用して「機能ごとに分割して開発」するイメージが付いたかと思います。
Flaskの基本を身につけたばかりの方にとっては、いきなりファイルを複数に分けたり、モジュールとして機能を構成したりすることに戸惑いがあるかもしれません。
しかし、実際のアプリ開発では避けて通れない重要な技術です。
学習項目 | 内容 |
---|---|
Blueprintとは | Flaskアプリケーションを「機能単位」で分けるための“設計図” |
ステップ1 | Blueprint() を使ってオブジェクトを生成し、プレフィックス付きで管理 |
ステップ2 | @オブジェクト.route() を使ってルーティングを定義 |
ステップ3 | app.register_blueprint() でFlaskアプリに登録して機能を有効化 |
ファイル分割 | viewsファイル、HTMLテンプレート、CSSファイルをフォルダ単位で整理 |
URLとテンプレートの連携 | /one/ や /two/ などのURLに応じてテンプレートやスタイルを切り替え |
Blueprintを使うことで、アプリケーションをモジュール化し、見通しのよい構成とチーム開発に強い設計を実現できます。
また、個人開発においても、機能を分けて管理することで後からの機能追加や修正がしやすくなります。
次回は、今回学んだ Blueprint の知識を活用して、「メモ帳アプリ」を作っていきます。
「Blueprintをどう活かせば現実的なアプリを作れるのか?」という疑問に、具体的な形で答えを示していきます。
FAQ|Flask Blueprintの使い方と構成方法
- Q1. Blueprintは必ず使わなければいけませんか?
-
小規模なアプリでは不要な場合もありますが、機能が増える中〜大規模な開発やチーム開発では、Blueprintを使うことでコードの見通しが良くなり、保守性が大きく向上します。
- Q2. Blueprintのurl_prefixは省略できますか?
-
はい、省略可能です。ただし、URLの整理や機能ごとのルーティングを明確にしたい場合は、prefixを付けるのが一般的でおすすめです。
- Q3. 複数のBlueprintから同じテンプレートを呼び出しても問題ありませんか?
-
問題ありません。ただし、テンプレート内のスタイルやパスの衝突に注意し、テンプレート名の命名規則やディレクトリ構成を工夫するのがポイントです。