DjangoとMTVの考え方について

この記事の内容
  • DjangoのMTVフレームワークについて

この記事の対象者
  • プログラミング学習者
  • Web開発に興味がある方
  • Djangoの学習者

プログラミング言語のフレームワークとしては、日本ではLaravelやRailsが人気ですが、世界を見てみると、現在Pythonを用いたWeb開発が主流になりつつあります。

Pythonで使われるフレームワークには主にFlask、そして、Djangoがありますが、特にDjangoがかなり色んなところで開発に用いられるようになってきました。

Flaskの方がよりシンプルで覚えやすいという声が多いですが、Djangoは反対に、アカウント管理や権限の設定など様々な機能がデフォルトで装備されており、セキュリティも強いと言われています。

Youtube, Dropbox, InstagramなどもDjangoで開発が行われてきた実績がありますね。

UdemyなんかもDjangoで動いていますし、Google もそのページの多くをDjangoで開発しています。

今回はそんなDjangoを包括的に理解するための根幹となる、MTV(モデル・テンプレート・ビュー)という考え方についてみていきたいと思います。

LaravelやRailsではMVC(モデル・ビュー・コントローラー)という考え方が使われているので、Djangoを使い始めた頃は私も理解するのに苦労しました。

そもそもなんでフレームワークを使うのか

Djangoに限らず、どんなフレームワークを使うにしろ、バックエンド言語でウェブサイトを作るということはそこにデータベースが必ず関わってきます。

MySQL, PostgreSQLなどが主な人気データベースですが、そのデータベースと連携することで写真、記事、動画、その他、ユーザーが入力した情報などを扱っていくわけですよね。

そして、データベースが絡んでくると基本的にはHTML・CSS・Javascriptだけではデータベースとの連携を取るのが難しくなるため、少し厳しくなってくる。

必然的に、スクリプト言語と言われる PHPやPythonなどを使用していくのですが、1からフロントからのデータを受け取って、DBに繋いで、データを取得して、計算して...

というのは、かなり面倒臭いです。

それなら、世界の先人たちが築き上げてきたコードを生かして、みんなでベストプラクティスの開発をできるようにしよう。

つまり、プロダクトのベースとなる部分は、ほとんど変わらないわけだから、パッケージ化してしまおう。

そこで使われるのが、フレームワーク。

その目的はただ一つです。

開発を早くすること

そして、サブな目的がいくつかあります。

バグを少なくする
開発するための学習コストを下げる

などなどです。

MTV(モデル・テンプレート・ビュー)という考え方

そもそもRailsやLaravelではMVC(モデル・ビュー・コントローラー)という考え方が採用されています。

MTVはざっくり言ってしまえば、TのテンプレートがMVCのV: ビューを、VのビューがMVCのC: コントローラーの位置に属しています。

とはいうものの、全く同じであるとは言えず、MTV(モデル・テンプレート・ビュー)という考え方をざっくり覚えておきましょう。

モデル

モデルは簡単に言えば、データベースと連携が取れる場所。

Djangoでアプリを作ると自動で生成されるmodels.pyがこれに該当します。

一例ですが、models.py の記述の一例をあげてみます。

from django.db import models
from django.contrib.auth.models import User


class Picture(models.Model):
    pub_date = models.DateTimeField()
    image = models.ImageField(upload_to='images/')

classで記述されているのがモデルです。 pub_dateやimageの部分では日にちと写真を扱っています。つまり、このクラスを呼び出せば、いつでもデータベースからこれらの日にちと写真を、引っ張ってくることができるのです。

しかもIDは自動生成されているので、そのIDを指定することで任意の写真を引っ張ってくることが可能なのです。

ビュー

そして、次がビューの考え方。 Laravelなどに慣れていると、ビューの捉え方に戸惑うと思いますが、このビューはDjangoの考え方でいうと、モデルで引っ張ってきたデータ情報をどのようにみせるかを記述していくところになります。

views.pyというファイルで
Djangoが自動生成してくれるファイルです。

見せ方という点で、pythonのコードがここでは大活躍します。

If文やWhile文、リスト、その他どのような構文もここで扱うことができるようになります。そして関数化することでフロントエンドのテンプレートに渡すことができるのです。

ビューでは、関数ごとにどのHTMLファイルに情報を渡すのか、を指定することができます。それによりそれぞれの関数をテンプレートに紐付けていくことになります。

テンプレート

テンプレートはMVCでいうV: ビューにあたります。

簡単にいうと、HTMLファイル。つまり、ダイレクトにスクリーンに反映されるコードですね。

templatesというフォルダの中に***.htmlという形で置き、CSSやjavascriptを用いて、さらに見栄えをよくしていくということになります。

このテンプレートでは、モデル(models.py)から直接情報を持ってくることはできません。

必ずビュー(views.py)を通して、データを取得し、テンプレートで扱うことになります。

今回は説明しませんが、htmlの中で、特殊な記述で、{{ }} や {% %} の間に記述することで関数をビューから引っ張ってくることができます。

つまりどういうことかというと、hoge = 1 という記述をviews.pyで行い、テンプレートに投げると、 {{ hoge }} とhtmlに記述することで、1が表示されるようになります。

面白いのが、この {{ hoge }} はCSSでもJSでも使用する事ができます。

この一連のつながりを料理である、うどんに例えるなら、

まず、モデルの部分で、うどんの原材料となる小麦粉系を調達しにいきます。

ビューの部分ではそれをこねて、成形して、湯がいていきます。

テンプレートの部分で出汁や他の材料等と合わせてうどんが完成するというわけですね。

まとめ

Djangoは非常にリッチなフレームワークです。何よりその利点は、数値計算や機械学習といった様々なPythonの長所をそのまま生かして、Web開発に反映できるというところではないでしょうか?

近年、AIというワードが頻繁に使われるようになってきました。それを簡単に扱うことのできるPython。そして、それを簡単にWebに反映させることができるのはPythonのフレームワークの魅力なのかな、と思っています。

以上、もう一度簡潔にまとめなおすと、モデルがDBとの連携。ビューがDBで抜きだしてきた情報の関数化(プログラミング)。テンプレートで送られてきた情報を表示。

もちろん、Djangoには他にも多くの設定があり(Settings.py, urls.py)、デプロイのためにはそれらの知識も欠かせませんが、まずはMTVという考え方を知ることで、実装がグッとわかりやすくなります!