PythonのWebアプリケーション（Django）を初心者にもわかりやすく解説（４）【ルーティング設定・MTVデザインパターン入門編】

# 解説記事の構成

|No.|タイトル||
|:--:|:--|:--:|
|1|[PythonのWebアプリケーション（Django）を初心者にもわかりやすく解説（１）【環境構築編】](http://qiita.com/carat_yoshizaki/items/f3c79e38b802c7fc8863)||
|2|[PythonのWebアプリケーション（Django）を初心者にもわかりやすく解説（２）【プロジェクト作成編】] (http://qiita.com/carat_yoshizaki/items/926f702198bdfe8c6bd2)||
|3|[PythonのWebアプリケーション（Django）を初心者にもわかりやすく解説（３）【アプリケーション作成・DB設定編】] (http://qiita.com/carat_yoshizaki/items/c9a5299b77b99ff07e4a)||
|4|[PythonのWebアプリケーション（Django）を初心者にもわかりやすく解説（４）【ルーティング設定・MTVデザインパターン入門編】](http://qiita.com/carat_yoshizaki/items/fbd235008d7484089270)|←|
|5|[PythonのWebアプリケーション（Django）を初心者にもわかりやすく解説（５）【Django shellでDB操作入門編】](http://qiita.com/carat_yoshizaki/items/8c57144dfd37e005fb17#_reference-8f82e1176420484c2fdd)||
|6|[PythonのWebアプリケーション（Django）を初心者にもわかりやすく解説（６）【MTVデザインパターン完成編】](http://qiita.com/carat_yoshizaki/items/f0b4f7d7fa3899f2d424)||


# 開発環境

* OS: Mac OS Sierra (10.12)
* Python 3.5.2

Macの環境を前提として話を進めていきます。

Pythonのバージョン確認は以下の通りです。

```bash
$ python3 --version
Python 3.5.2
```


# ウェブページの作成

## ルーティングの設定

```mysite/urls.py``` にて管理画面(admin)とブログ用にルーティング（URL）の設定を行います。

```py:mysite/urls.py
from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'', include('blog.urls')),
]
```

```admin``` に関しては、Django admin が自動的に設定してくれていますが、blog に関してはまだ何も作成していないため、設定を行っていきます。

```blog/urls.py``` という空ファイルを作成し、以下のように編集します。

```py:blog/urls.py
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.post_list),
]
````

```urlpatterns``` については、[Django Girls Tutorial](https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/content/django_urls/) より抜粋します。

>これは^$というパターンのURLをpost_listというビューに割り当てたことを意味します。
^$ とは何を意味しているのでしょうか。
それは正規表現のマジックです:）分解してみましょう：
>
* 正規表現での^は「文字列の開始」を意味します。ここからパターンマッチを始めます。
* $は「文字列の終端」を意味していて、ここでパターンマッチを終わります。
>
この2つの記号を並べたパターンがマッチするのは、そう、空の文字列です。といっても、DjangoのURL名前解決では 'http://127.0.0.1:8000/' は除いてパターンマッチするので、このパターンは 'http://127.0.0.1:8000/' 自体を意味します。つまり、'http://127.0.0.1:8000/' というURLにアクセスしてきたユーザに対して`views.post_list`を返すように指定していることになります。

要するに、現状は ```urlpattern``` で何も文字列のないURL (ルートディレクトリ)に対して、```post_list``` を割り当てると宣言しています。
```post_list``` のViewはまだ作っていないため、当然アクセスできません。

# Djangoのデザインパターン

それでは、設定したURLに対応する表示画面を作っていくのですが、まずDjango内でどのように表示される画面やデータベースが管理されているか知っておく必要があります。

Djangoの話をする前に、代表的なデザインパターンであるMVCを見てみましょう。
MVCを理解しておけば今後の汎用性も高いですし、Djangoで採用されているMTVデザインパターンも簡単に理解できると思います。

## Ruby on Railsなどで採用されているMVCデザインパターン

Webアプリケーションでは、よくMVCデザインパターンとして管理されることが多いです。
MVCは Model View Controller の略で、それぞれの役目は以下のようになります。
Ruby on RailsがこのMVCデザインパターンの典型的な例ではないでしょうか。

![](https://blog.chattyhive.com/wp-content/uploads/2014/01/mvc_detailed-full.png)

ユーザーからアクセスした情報をもとに、Controllerが仲介役となって、ModelとViewから必要な情報を引き出し、それらをまとめてユーザーに返すといったイメージです。
すごくざっくりと言うと、ViewがHTMLでModelがDB、Controllerがその管理役です。
そんな定番のMVCデザインパターンは慣れると非常に分かりやすく、そして扱い易いです。

## DjangoはMTVデザインパターン

DjangoではMVCではなく、MTVデザインパターンと呼ばれるデザインパターンで管理しているようです。
※ この辺りは宗教争いのようなものでしょうか。

MTVは Model Template View の略称です。

![](http://blog.easylearning.guru/wordpress/wp-content/uploads/2015/08/MVC-Vs-MTV-300x178.png)

色々と理由はあると思いますが、MVCデザインパターンで良いのに、、、というのが個人的な思いです。
基本的には、MVCとMTVは一対一対応するようなので、頭の中でMVCからMTVへと変換するようにしてください。

## MTVの参考記事
* [Python + Django してみた。 MTV Model について](http://mimumimu.net/blog/2011/11/21/python-django-%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E3%80%82-mtv-model-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/)
* [Implementing MTV model in Python Django](https://www.google.co.jp/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&ved=0ahUKEwiQ--nhgaDQAhVLfLwKHW23BWEQjhwIBQ&url=http%3A%2F%2Fblog.easylearning.guru%2Fimplementing-mtv-model-in-python-django%2F&psig=AFQjCNFX3N_Iwfe29CaOZ8djG0oa6V4_2A&ust=1478929512330040)


# Viewの設定

設定されたURLからどのTemplateを読み込むか、Templateにどのような情報を渡すかといった部分を制御しているのがViewです。
※ Ruby on RailsなどのMVCデザインパターンではControllerと呼ばれている部分です。

```blog/views.py``` を作っていきます。

```py:blog/views.py
from django.shortcuts import render

# Create your views here.
def post_list(request):
    return render(request, 'blog/post_list.html', {})
```

さきほどのURLが ```post_list``` というメソッドにアクセスするように設定されていたので、```def post_list``` を定義し、その中で ```request``` を引数に取っています。
```render``` メソッドでは、```blog/post_list.html``` というテンプレートファイルを使って、引数で受け取った ```request``` の内容を出力しています。
メソッド名とテンプレートファイル名を一致させておけば管理が楽ですね。
※ Ruby on Railsは基本的にメソッド名とテンプレートファイル名が一致することを前提として、```render``` はわざわざ書きません。

# Templateの作成

それではテンプレートファイルを作りましょう。
まずTemplate用のディレクトリを作ります。

```bash
$ mkdir blog/templates
$ mkdir blog/templates/blog
```

この中に、```post_list.html``` を作成していきます。

```html:blog/templates/blog/post_list.html
<html>
    <p>Hi there!</p>
    <p>It works!</p>
</html>
```

これを保存したあとに、http://127.0.0.1:8000/ にアクセスすると、以下の用に、テンプレートが読み込まれて動作します。

<img width="217" alt="スクリーンショット 2016-11-11 3.35.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/130181/0c6a7ba6-5f56-dc7b-d455-d5d1920605d9.png">

HTMLの書き方に関しては、他にも参考文献がたくさんあるので、解説はそちらに譲るとします。

これで、URLを設定したオリジナルのテンプレートに対して、ウェブページを表示させることが出来るようになりました。

# 次回の解説記事
[PythonのWebアプリケーション（Django）を初心者にもわかりやすく解説（５）【Django shellでDB操作入門編】](http://qiita.com/carat_yoshizaki/items/8c57144dfd37e005fb17#_reference-8f82e1176420484c2fdd)


# 参考文献

* [Django](https://www.djangoproject.com/)
* [Django Girls Tutorial「Django urlsってなに？」](https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/content/django_urls/)
* [Django Girls Tutorial「Django ビューってなに？」](https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/content/django_views/)

# おまけ

フォローお待ちしています！

* Qiita: [Carat 吉崎](http://qiita.com/carat_yoshizaki)
* twitter：[@carat_yoshizaki](https://twitter.com/carat_yoshizaki)
* はてなブログ：[Carat COOのブログ](http://carat-tech.hatenablog.com/)
* ホームページ：[Carat](http://caratinc.jp)

サービス紹介
「数学→プログラミング→Webアプリケーション」まで一気に学べる機械学習のマンツーマン家庭教師サービス「[キカガク](https://kikagaku.net)」に興味のある方はお気軽にご連絡ください。