プログラミング言語のフレームワークとしては、依然にLaravelやRailsが人気ですが、グローバルに見てみると、じわじわとPython勢が勢力を増しているように感じます。
Pythonで使われるフレームワークがFlask、そして、Djangoですね。
Flaskの方がよりシンプルで覚えやすいという声が多いですが、Djangoはその反面、リッチなコンテンツでセキュリティも強いと言われています。
あと
Youtube, Dropbox, Instagramなどが代表的なDjangoで作られたアプリケーションですね。
今回はそんなDjangoを包括的に理解するための根幹となる、MTV(モデル・テンプレート・ビュー)という考え方についてみていきたいと思います。
LaravelやRailsではMVC(モデル・ビュー・コントローラー)という考え方が使われているので、Djangoを使い始めた頃は私も理解するのに苦労しました。
しばらく使ってみて、やっと本質的なところがみえてきたので、シェアしたいと思います。
##そもそもなんでフレームワークを使うのか
Djangoに限らず、どんなフレームワークを使うにしろ、バックエンド言語でウェブサイトを作るということはそこにデータベースが必ず関わってきます。
MySQL, PostgreSQLなどが主な人気データベースですが、そのデータベースと連携することで写真、記事、動画、その他、ユーザーが入力した情報などを扱っていくわけですよね。
そして、データベースが絡んでくると基本的にはHTML・CSS・Javascriptだけではデータベースとの連携が取れなくなるため、少し厳しくなってくる。
そこで登場するのが、フレームワーク。
####ブログを作りたい、写真を共有したい
そのためには投稿された記事や写真を格納しておくためのデータベースが必要になってくる。
そして、その情報をユーザーのみている画面に持ってこなければいけない。
そこでサーバーサイドで活動するバックエンド言語を活用したフレームワークが登場というわけです。
##MTV(モデル・テンプレート・ビュー)という考え方
そもそもRailsやLaravelではMVC(モデル・ビュー・コントローラー)という考え方が採用されています。
MTVはざっくり言ってしまえば、TのテンプレートがMVCのビューを、VのビューがMVCのコントローラーの位置に属しています。
とはいうものの、全く同じであるとは言えず、MTV(モデル・テンプレート・ビュー)という考え方をざっくり覚えておきましょう。
##モデル
モデルは簡単に言えば、データベースと連携が取れる場所。
Djangoでアプリを作ると自動で生成されるmodel.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でいうビューにあたります。
簡単にいうと、HTMLファイル。つまり、ダイレクトにスクリーンに反映されるコードですね。
templatesというフォルダの中に***.htmlという形で置き、CSSやjavascriptを用いて、さらに見栄えをよくしていくということになります。
このテンプレートでは、モデル(models.py)から直接情報を持ってくることはできません。
必ずビュー(views.py)を通して、関数化、パッケージ化されたデータをテンプレートで扱うことになります。
今回は説明しませんが、htmlの中で、特殊な記述で、{{ }} や {% %} の間に記述することで関数をビューから引っ張ってくることができます。
この一連のつながりを料理である、うどんに例えるなら、
まず、モデルの部分で、うどんの原材料となる小麦粉系を調達しにいきます。
ビューの部分ではそれをこねて、成形して、湯がいていきます。
テンプレートの部分で出汁や他の材料等と合わせてうどんが完成するというわけですね。
##まとめ
Djangoは非常にリッチなフレームワークです。そして、何よりその利点として、数値計算や機械学習といった様々なPythonの機能をそのままWebに反映できるというところではないでしょうか?
近年、AIというワードが頻繁に使われるようになってきました。それを簡単に扱うことのできるPython。そして、それをWebに反映させることができるのはPythonのフレームワークの魅力なのかな、と思っています。
以上、もう一度簡潔にまとめなおすと、モデルがサーバーとの連携。ビューがサーバーで抜きだしてきた情報の関数化。テンプレートで関数化された情報を反映。
もちろん、Djangoには他にも多くの設定があり(Settings.py, urls.py)、デプロイのためにはそれらの知識も欠かせませんが、まずはMTVという考え方を知ることで、実装がグッとわかりやすくなります!