3歩歩けば忘れてしまうアホな自分自身のために最もプリミティブにまとめてみた。
前提:REST APIやフロントフレームワークは使用しない。
MVTとはなにか?
DjangoのMVTは、Model-View-Templateの略で、以下のような役割分担を持つアーキテクチャです。語弊を恐れず要してみようと思います。
データベースとのやり取りを担当。データ構造やビジネスロジックを定義します。
また、ここで記述された内容を元にmigrationファイルを作成し、データベースのテーブルを作成します。
「ORM(Object-Relational Mapping: ModelとDBの連携を簡単にしてくれるすごいやつ)」により、SQLを直接書かなくてもデータベース操作を簡単に実行できます。
ユーザーリクエストに応じて、必要なデータをModelから取得し、テンプレートに渡します。
取得したデータの処理など、システムのコア部分のロジックはここに記述されます。
ページ描画を担当。Viewから渡されたデータをHTMLとして整形し、クライアント(ブラウザ)に返します。
基本的な設計として、base.htmlというファイルを作成し、そこにベースとなるHTMLを記述します。
その中(HTML)に、データを表示するためのブロック(可変部分)を記述し、各ページが担う情報を提供し、バックエンドから受け取るデータを埋め込むことができます。
「OK、完全理解」の図
データ送信と結果の出力方式
データ送受信の流れ
- ブラウザはHTTPリクエストをサーバーに送信します(GETやPOSTなどのメソッド)。
- Djangoは、リクエストを
urls.py
で特定のViewにルーティング。 - Viewがリクエストデータを処理し、必要に応じてModelからデータを取得・処理。
- 最後に、Viewがテンプレートエンジンを使いHTMLを生成し、クライアントにレスポンスを返します。
この方式はサーバーサイドテンプレートレンダリング(もしくはDjango固有のMVTアーキテクチャ)と呼ばれ、
広義には、SSR(Server-Side Rendering:サーバーサイドでHTMLを生成する仕組み) と表現することも。
API通信とMVTの活用場面の比較
MVT
サーバーサイドレンダリング(SSR) の伝統的な手法で、 多ページアプリケーション(MPA) でよく使われます。フロントエンドに複雑な処理が必要なく、サーバー側で全てのHTMLを生成して効率的に提供できる。
SEOが重要な静的・動的サイトと相性が良い。
API通信
フロントエンドが進化した現在では、REST APIやGraphQLを使ったクライアントサイドレンダリング(CSR) が主流。
特に シングルページアプリケーション(SPA) やモバイルアプリとの連携を考える場合には、API通信がスタンダードとなる。この場合バックエンドからのレスポンスとしてJSONやXMLなどのデータを受け取りフロントで処理・表示する。
API通信は現在のWeb開発で広く使われており、デファクトスタンダード(事実上の標準、みんながとりあえず使うやつ)といえるが、シンプルなウェブサイトやSEOが重要なケースでは、MVTも十分に活躍できる方式。