Djangoを始めよう！ 〜チュートリアル①〜

# 概要

[前回](http://qiita.com/gcfuji/items/bf526e7b4fa052a9142e)の続きです。
今回は、Pythonの中で一番人気のWebアプリフレームワーク「[Django](https://www.djangoproject.com/)」のチュートリアルを一通りやりたいと思います。
やっぱり、フレームワーク入門は本家のチュートリアルに限ると思います。
ラッキーな事に、[Django](https://www.djangoproject.com/)では日本語翻訳のチュートリアルも存在しました。

![django-logo.jpg](https://qiita-image-store.s3.amazonaws.com/0/129216/8bdd1557-274d-371b-d88e-060fd59a89fb.jpeg)


チュートリアルでは、投票(poll)アプリの様なものを作成しています。
簡単な要件としては、以下となります。

- ユーザが投票したり結果を表示したりできる公開用サイト
- 投票項目の追加、変更、削除を行うための管理 (admin) サイト

# Pythonのフレームワーク

Pythonフレームワークには「[Django](https://www.djangoproject.com/)」を選びました。
理由は以下の様な理由です。

- Djangoの拡張フレームワークとして、[djangorestframework](http://www.django-rest-framework.org/)というRESTfulAPIを制作するのに特化したものがあった。
	- React + Djangoが実現できそう。
- PythonのWebアプリフレームワークでは一番人気な為、日本語の参考資料などが多い。
- AWS関連のDjango専用モジュールがたくさんあった。

他の候補では、「Bottle」や「Flask」や「Tornado」なども人気が出てきているみたいでしたが、Pythonという大きな概要を掴むためにも、一番人気のフレームワークから入門したいと思います。

# 環境

前回までの文法編では、Python2.x系を使ったので、今回は3.x系で進めたいと思います。

| **項目** | **内容** |
| --- | --- |
| OS | MacOS X |
| Python | v3.5.2 |
| Django | v1.10.2 |

# Djangoのインストール

以下のコマンドでDjangoをインストールします。

```sh:terminal
$ pip install django
```

以下のコマンドでインストールとバージョンを確認します。

```sh:terminal
$ python -m django --version
>>>1.10.2
```

# プロジェクトを作成する

Djangoでは、プロジェクトを作成する為のコマンドが準備されています。
今回は、 **mysite** という、チュートリアルと同じプロジェクトを作成します。

```sh:terminal
$ django-admin startproject mysite
```

## Djangoのプロジェクトの概念

プロジェクトとは、データベースの設定やDjango固有のオプション、アプリケーション固有の設定などといった、個々のDjangoインスタンスの設定を集めたものです。

## startprojectで作成されたファイル

startprojectを実行すると、以下の様なディレクトリが作成されます。

```
mysite/
	manage.py
	mysite/
		__init__.py
		settings.py
		urls.py
		wsgi.py
```

### 外側のmysite

外側の mysite/ ルートディレクトリは、このプロジェクトのただの入れ物です。 この名前はDjangoに関係しませんので、好きな名前に変更できます。

### manage.py

Django プロジェクトに対する様々な操作を行うためのコマンドラインユーティリティです｡

### 内側のmysiteディレクトリ

このプロジェクトの本当のPythonパッケージです。この名前が Python パッケージの名前であり、 importの際に 使用する名前です (例えば import mysite.urls) 。

### mysite/__init__.py

このディレクトリがPythonパッケージであることをPythonに知らせるための空のファイルです。

### mysite/settings.py

Django プロジェクトの URL 宣言、いうなれば Django サイトにおける「目次」に相当します。

### mysite/wsgi.py

プロジェクトをサーブするためのWSGI互換Webサーバーとのエントリーポイントです。

各々のファイルは実際に修正する際に、再度詳しく説明したいと思います。

# 開発用サーバー

Djangoでは予め簡易的なWebサーバ準備してくれています。
以下のコマンドで開発用サーバを起動できます。

```sh:terminal
$ python manage.py runserver
>>>
Performing system checks...

System check identified no issues (0 silenced).

You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

October 10, 2016 - 16:28:45
Django version 1.10.2, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```

マイグレーション関連でエラーを吐きますが、現状は無視でOKです。

実際ブラウザで確認しています。
localhost:8000をブラウジングすると以下になるはずです。

![スクリーンショット 2016-10-11 1.31.19.png](https://qiita-image-store.s3.amazonaws.com/0/129216/88910796-9897-b579-8def-442f3cb3534e.png)

It worked!が表示されていれば、無事簡易サーバが立ち上がっています。
(今は英語ですが、日本語に変更可能です。)
(ポート番号も変更可能です。)

# アプリケーションを作成する

今回はチュートリアル通り投票アプリを作っていきたいと思います。

## プロジェクトとアプリケーションの違い

一つのプロジェクトには複数のアプリケーションを入れられます。また、一つのアプリケーションは複数のプロジェクトで使えます。

### プロジェクト

プロジェクトとは、あるウェブサイト向けに「設定」と「アプリケーション」を集めたものです。

### アプリケーション

アプリケーションとは、実際に何らかの処理を行うWebアプリケーションを指します。(機能と表現していいかもしれません)
例えばブログシステムや公開レコードのデータベース、単純な投票アプリといった具合です。

## アプリケーションの作成コマンド

以下のコマンドで新規アプリケーションを作成できます。
今回は、投票(poll)のアプリケーションを作ります。

```
$ python manage.py startapp polls
```

## ビューの作成

各アプリケーションに作成された、views.pyにビューを制作していきます。

今回はrequestを受けて、responseを返す簡単なビューを作成しています。

```py:mysite/poll/views.py
from django.shortcuts import render
from django.http import HttpResponse


def index(request):
    return HttpResponse('Hello World from Polls')
```

## URLの対応付け

### pollsのURLconfを作成する

ビューを呼ぶためには、URLの対応付けをする必要があります。
URLconfが必要となります。

pollsディレクトリにURLconfを作るために、 **urls.py** というファイルを作ります。

### ルートのURLにpollsを対応させる

次のステップはルートのURLconfに``polls.urls`` モジュールの記述を反映させることです。

ルートのURLconfを以下の様に修正します。

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

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

### ルーティングが制御できているかを確認する

実際に、サーバを起動して、localhsot/pollsでアクセスできるか試して見ましょう。

![スクリーンショット 2016-10-11 2.27.31.png](https://qiita-image-store.s3.amazonaws.com/0/129216/d6dae5b4-4174-160d-03c4-5289e7d260d4.png)

上の様に文字が表示されていたらルーティング成功です。

### url関数

url() 関数は4つの引数を受け取り、そのうち2つが必須です。
regex と view 、オプションで kwargs と name です。ここで引数が何のためにあるものかを見ておきましょう。

#### 引数

##### regex(regular expression)

第1引数では、正規表現でURLパターンを指定します。
この引数は必須です。

##### view

Django がマッチする正規表現を見つけると、 Django は所定のビュー関数を呼び出します。その際は HttpRequest オブジェクトを第一引数に、その他、正規表現から「キャプチャされた」値を他の引数に関数を呼び出します。
この引数は必須です。

##### kwards

任意のキーワード引数を辞書として対象のビューに渡せます。この機能はチュートリアルでは使いません。
この引数はオプションです。

##### name

URL に名前付けをしておけば Django のどこからでも明確に参照でき、とくにテンプレートの中で有効です。この便利な機能のおかげで、プロジェクトのURLにグローバルな変更を加える場合にも1つのファイルを変更するだけで済むようになります。


# まとめ

チュートリアルの第1章はここまでです。
開発環境の構築から、プロジェクト、アプリケーションの作成と、
単純なビューの表示と、URLconfの設定を見てきました。

次回は、DBとの連携と、もう少し複雑なテンプレートを利用したビューの表示をしたいと思います。

# シリーズ

- [Djangoを始めよう！ 〜チュートリアル①〜](http://qiita.com/gcfuji/items/bff55a0b8ae1b76c0ca1)
- [Djangoを始めよう！ 〜チュートリアル②〜](http://qiita.com/gcfuji/items/27d2c9e4b3334447b6af)
- [Djangoを始めよう！ 〜チュートリアル③〜](http://qiita.com/gcfuji/items/c8a0e4add7a628c12f8d)
- [Djangoを始めよう！ 〜チュートリアル④〜](http://qiita.com/gcfuji/items/68101227141cde134326)
- [Djangoを始めよう！ 〜チュートリアル⑤〜](http://qiita.com/gcfuji/items/1b6079bec064a4e8b211)
- [Djangoを始めよう！ 〜チュートリアル⑥〜](http://qiita.com/gcfuji/items/8560eade5a11c08a0ff1)