ITや趣味など気軽に投稿しています。

【Python】FlaskでWebアプリケーションを作る② -ディレクトリ構成

FlaskでWebアプリケーションを開発する際、ディレクトリ構成のルールを理解しておくことは非常に重要です。適切な構成にすることで、コードの可読性・保守性が向上し、チーム開発もスムーズに進められます。

この記事では、Flaskにおけるディレクトリ構成の考え方と、具体的な構成例を紹介します。

ディレクトリ構成を統一する理由

Flaskには推奨されるディレクトリ構成のルールがあります。このルールに従うことで、以下のメリットが得られます。

  • 可読性の向上: ファイルの役割が明確になり、コードの全体像を把握しやすくなる
  • チーム開発の効率化: 共通のルールに従うことで、メンバー間の認識のズレを防げる
  • 保守性の向上: 機能ごとにファイルが分離されるため、変更の影響範囲を限定できる
  • フレームワークとの統合: Flaskがデフォルトで参照するディレクトリ名に合わせることで、余計な設定が不要になる

特にチーム開発では、ディレクトリ構成がバラバラだとマージ時にコンフリクトが発生しやすくなります。標準的なルールをあらかじめ決めておくことで、こうした問題を未然に防げます。

ディレクトリ構成

最小構成

前回の記事ではmain.pyだけでWebアプリケーションを起動しましたが、実用的な最小構成は以下のようになります。

sample_app
│
├─main.py
│
├─static
│      index.css
│      sample.css
│
└─templates
        index.html
        sample.html

/static

JavaScriptやCSS、画像ファイルといった静的ファイルを格納するディレクトリです。ブラウザが直接読み込むファイルをここに配置します。

/templates

HTMLファイル(テンプレート)を格納するディレクトリです。Flaskのテンプレートエンジン(Jinja2)で処理されるHTMLファイルをここに配置します。

ポイント: statictemplatesという名称はFlaskのデフォルト設定で決められています。これら以外の名称を使いたい場合は、Flask()のコンストラクタで別途指定する必要があります。

実用的なアプリケーションの構成

最小構成では処理ロジックをすべてmain.pyに記述する必要があり、コードが肥大化しやすくなります。実用的なアプリケーションでは、役割ごとにファイルを分離した構成が推奨されます。

sample_app
│
│  main.py
│  requirements.txt
│  settings.py
│
├─common
│  └─models
│       models.py
│       crud.py
│
├─controllers
│       index.py
│       sample.py
│
├─static
│      index.css
│      sample.css
│
└─templates
        index.html
        sample.html

各ファイル・ディレクトリの役割は以下の通りです。

main.py

アプリケーションのエントリーポイントです。Flaskインスタンスの生成、ルーティングの登録、サーバの起動などを行います。

requirements.txt

アプリケーションで必要なライブラリの一覧を記載するファイルです。pip freeze > requirements.txtで生成でき、pip install -r requirements.txtでまとめてインストールできます。環境の再現やサーバ移行時に役立ちます。

settings.py

データベースの接続情報や環境変数など、アプリケーション全体で共通して利用する設定値を定義するファイルです。設定をプログラムコードから分離して管理することで、環境ごと(開発・本番など)の切り替えが容易になります。

/common/models

データベースの接続処理、テーブル定義(モデル)、CRUD操作に関するスクリプトを管理するディレクトリです。データアクセス層を分離することで、ビジネスロジックとの責務を明確に分けられます。

/controllers

アプリケーションの実際のビジネスロジックを記述するディレクトリです。機能ごとにファイルを分けるのが一般的です。たとえば、トップページの処理はindex.py、サンプルページの処理はsample.pyのように分割します。

構成を決めるときのポイント

ディレクトリ構成は、開発するアプリケーションの規模や要件に応じて柔軟に調整します。以下のポイントを意識すると、適切な構成が見えてきます。

  1. 必要な機能を洗い出す: どのようなページや処理が必要かを整理する
  2. 責務ごとに分離する: 表示(テンプレート)、ロジック(コントローラー)、データ(モデル)を分ける
  3. 拡張性を考慮する: 将来的な機能追加を見据えた構成にする

複数の役割を1つのファイルに集約してしまうと、コードの可読性・保守性が低下します。「1ファイル1責務」を意識して構成を設計しましょう。

まとめ

この記事では、Flaskアプリケーションのディレクトリ構成について解説しました。

  • Flaskにはstatic(静的ファイル)とtemplates(HTML)のデフォルトディレクトリがある
  • 実用的なアプリケーションでは、controllersmodelsなどで役割ごとにファイルを分離する
  • requirements.txtsettings.pyで依存関係や設定を一元管理する
  • チーム開発では構成ルールの統一が特に重要

次回は、Flaskのルーティングについて詳しく解説します。