今回もFlaskについてですね
うむ。前回は簡単なコードでFlaskを動かしてみたが、拡張を考えると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ファイルを格納するディレクトリです。
staticやtemplatesという名称はデフォルトで決められている。これら以外の名称を使いたい場合はプログラム内で別途指定する必要がある。
どうせ共通のディレクトリ構成にするでしょってことで、事前に決まってるんですね。
少し複雑なアプリケーションの構成
最小構成ではプログラムの処理ロジックをメインのスクリプトに書く必要があり、冗長になってしまいます。そこで、処理部分は別ファイルに切り出してみます。
また、データベースに接続してデータを読み書きすることを想定し、DB含め共通設定を定義したファイルと、読み込んだ定義のモデル定義をするためのフォルダも作成します。
sample_app
│
│ main.py
│ requirements.py
│ settings.py
│
├─common
│ └─models
│ models.py
│ crud.py
│
│
├─controllers
│ index.py
│ sample.py
│
├─static
│ index.css
│ sample.css
│
└─templates
index.html
sample.html
requirements.py
このファイルには、アプリケーションで必要なライブラリの一覧を記載します。ライブラリ一覧のバックアップという側面のほか、サーバ移行等で環境を移す際に役に立ちます(記載したライブラリをまとめてインストールできる)。
settings.py
アプリケーションで共通して利用する共通項目を定義しておくためのファイルです。DBの接続情報や環境変数、その他プログラムから外出しで管理すべき値を格納しておきます。
/common/models
ここではDBの接続処理やテーブル定義、CRUD操作に関するスクリプトを管理します。
/controllers
ここにはアプリケーションの実際の処理を書いていきます。Webアプリケーションに限らずですが、機能ごとにファイルを分けるのが一般的です。
個々のファイルの中で具体的にどのような処理や値を書くのかといったところは、別の機会に説明しよう。
今回は、それぞれの大まかな役割がわかればよい。
つまり、それぞれの役割ごとにファイルを分けて管理するってことですね。
そうだな。複数の役割を1つのファイルに集約してしまうと、コードの管理がしづらくなる。
「混ぜるな危険」だな。
まとめ
今回はFlaskのディレクトリ構成について説明したが、作りたいWebアプリケーションの規模や内容によって、必要なディレクトリを取捨選択するようにしてほしい。
取捨選択の基準って何かあるんですか?
そんなものはない。センスが試される。
博士何か投げやりですか?
失礼な。
まあ、作りたい機能は何で、そのためにどういった処理やデータが必要で、、といったように掘り下げていけば、自然と必要な構成は見えてくる。
今回はここまで。次回もFlaskを続ける。
ありがとうございました~~♪