【Django】Webアプリ入門 Part1 MTVモデルとは


はじめに

この記事シリーズでは、Python、JavaScript歴1年の大初心者がどうにか頑張ってWebアプリを作ろうとする過程を克明に描き出したいと思います。
なるべく公式ドキュメントやいろいろなサイトを調べて間違いのないようにしますが、これは違うんじゃない?と思ったら是非コメントをください!!
ほかのプログラマ・エンジニアの方の生の声をいただくことは初心者にとっては貴重な学習の機会になります!!

Part1でやること

前回の記事ではDjangoとReact.jsを使ってWeb家計簿アプリを作るという方針を決定しました。
今回からはDjangoについて学んでいこうと思います。
いきなり環境構築やコーディングから始める前にDjangoの骨子を一通り確認してみたいと思います。

Webアプリケーションに必要なこと

Webページは適切な実行環境とHTMLファイルさえあれば作ることができます。
しかし、それだけでは動的なWebページにするのは限界があります。
Webページが動的であるとは、ユーザーからのデータによって表示する内容を変える仕組みを持っているということです。
さらに本格的なWebアプリケーションではデータを保持、管理する仕組みが必要不可欠になってきます。
主にそれはデータベースによって実現されます。
また、データベースやユーザーから取得したデータの処理はHTMLファイルでは行えないので、それを処理してHTMLファイルに埋め込む仕組みも必要です。

まとめると、ある程度の規模を持つWebアプリケーションを作成するためにはHTMLファイル、データベース、ユーザーとデータベースからのデータを処理する仕組みの3つが必要であるということです。
(補足: 実行環境のことなどを考えるともっといっぱい必要になります。大変ですね...)

Djangoとは?

Djangoは先ほど述べた3つの仕組みのうちでは、HTMLファイルと、ユーザーとデータベースからのデータを処理する仕組みを提供します。
もう少し正確に言うとHTMLファイルを提供するというよりかは、データを埋め込んだHTMLファイルを作成する仕組みを提供します。
その中で開発者側が基本的に操作する部分は3つに大別され、M(モデル) T(テンプレート) V(ビュー)と呼ばれます。
次のセクションからそれぞれが何をするところなのかを見てみます。

T(テンプレート)

先ほどDjangoではデータを埋め込んだHTMLファイルを作成する仕組みがあると述べました。
ここをもう少し詳しく説明すると2ステップに分かれます。
まず、開発者は決まりに従ってテキストファイルを作成します。その際に埋め込みたいデータも記述します。
そして、Djangoアプリケーションが実行されると、そのテキストファイルが自動的に翻訳されHTMLファイルに変換されます。
このようにしてデータが埋め込まれたHTMLファイルが作成されるのですが、このときに元となるテキストファイルをテンプレートといい、テンプレートをHTMLファイルに変換する機能を持つソフトウェアをテンプレートエンジンと言います。
開発者はテンプレートエンジンをカスタマイズすることもできますが、デフォルトでも十分便利です。よってテンプレートだけを気にすればよいのです。

テンプレートにはユーザーとデータベースからのデータを埋め込むことができますが、そのデータはビューから渡されます。
ユーザーはそれをもとに作られたHTMLファイルをWebブラウザが整形したWebページを見るのですが(ややこしい)、
その際にフォーム等があったときはその入力データがテンプレートで記述したルールに従ってビューに渡されます。
詳しくはビューのセクションを見てください。

M(モデル)

Djangoとは?のセクションで、Djangoはユーザーとデータベースからのデータを処理する仕組みを提供すると述べました。そしてテンプレートのセクションの最後でユーザーからのデータを処理する仕組みは軽く説明しました。
データベースからデータを取得し処理する仕組みはどうなっているのでしょうか。
基本的なやり方ではモデルというクラスを用意して、ビューからそれを操作することで間接的にデータベースを操ります。
モデルがビューとデータベースのインターフェース(接点)となるというわけですね。
このようにデータベースの情報をオブジェクト指向的にあらわす手法をO/Rマッピングと言います。

実は、ビューから直接データを取得することもできます。
何故ビューから直接データを操らないのかというのは思想的な問題になるので
初学者からすると何とも言えませんが、このスライドをみてなるほどーと思いました。
しかし、O/Rマッピングは百害あって一利なし!と考える人もいます。
(余談ですが技術的なことよりこういう思想的なことを学ぶほうが大変ですよね...)

V(ビュー)

ビューはテンプレートとモデルで述べたように、ユーザから送られてきたりデータベースから抜き出したデータを処理し、
データベースに反映したりWeb上での表示を変えたりする、全体の制御役を務めます。その実体は関数やクラスです。
モデル・テンプレートとの関係を明確にすると、
ビューはモデルやそのインスタンスを操作することでデータベースからデータを取得したり追加や削除をし、
ユーザーの様々な入力情報を取得し、それらやデータベースからのデータをテンプレートに渡すという役割を持っています。

ビューはURLと対応しており、「このURLが指定されたらこのビューの処理を実行させる」という形でその機能を果たしています。
よって、全体の流れを確認すると
URLが指定される->ビューが呼び出される->ビューは諸データを取得・処理しテンプレートファイルに渡す
->そのファイルはテンプレートエンジンによりHTMLファイルに変換され、ブラウザに渡される->Webページが表示される
といったようになります。

まとめ

簡単にテンプレート・モデル・ビューについてまとめると、
テンプレートは実際の表示となるHTMLファイルをつくる元となるテキストファイルで、
モデルはデータベースと対応し、Django上でビューとデータベースのインターフェース的役割を果たすクラスであり、
ビューはテンプレートやモデルを制御する関数やクラスのことです。
これによってWebアプリケーションのうちのHTMLファイルを提供する仕組みと様々なデータを取得し処理する仕組みが実現されます。
次回ではDjangoの開発環境構築を行いたいと思います。
ご感想やご意見がありましたら是非コメントしてください!