【解説付き】Django チュートリアル その１

# はじめに

これは、[djangoチュートリアル](https://docs.djangoproject.com/ja/2.2/intro/tutorial01/)を説明をつけて初学者にわかりやすく学んでいただきたいというためのものです。

# 対象

 - pythonはなんとなくわかってるけど、djangoを覚えたい
 - 業務でdjango触ってたけど、きちんと理解したい

上記の方々を対象としています。
環境は、Macを使用して進めていきますので、Windowsユーザーの方は、Windows環境に読み替えてついてきていただければと思います。

# 目次
 - 【解説付き】Django チュートリアル その１
 - [【解説付き】Django チュートリアル その2 -前編-](https://qiita.com/murabo/items/9fc69b419b4415d7dbeb)
 - [【解説付き】Django チュートリアル その2 -後編-](https://qiita.com/murabo/items/66e56803bf53d39fe640)


# 準備

djangoのチュートリアルは、インストール済みの前提で話が進んでいます。
ここでは、インストールから進めていこうと思います。

## pythonのインストール
弊社ではpython2系のプロジェクトも並行して走っている兼ね合いで、pyenvで仮想環境を作成します。
pyenv + virtualenv + pythonのインストールは、こちらの[pyenv と pyenv-virtualenv で環境構築](https://qiita.com/Kodaira_/items/feadfef9add468e3a85b)を参考にインストールしていただければと思います。
(gitでインストールする方が、バージョンアップや削除したい場合に、扱い安いと思い、私はgitでインストールしています。)

## djangoのインストール

djangoはpipコマンドでインストールします。

```console
$ pip install django
Collecting django
  Downloading https://files.pythonhosted.org/packages/d6/57/66997ca6ef17d2d0f0ebcd860bc6778095ffee04077ca8985928175da358/Django-2.2.4-py3-none-any.whl (7.5MB)
     |████████████████████████████████| 7.5MB 5.5MB/s
Collecting sqlparse (from django)
  Using cached https://files.pythonhosted.org/packages/ef/53/900f7d2a54557c6a37886585a91336520e5539e3ae2423ff1102daf4f3a7/sqlparse-0.3.0-py2.py3-none-any.whl
Collecting pytz (from django)
  Downloading https://files.pythonhosted.org/packages/87/76/46d697698a143e05f77bec5a526bf4e56a0be61d63425b68f4ba553b51f2/pytz-2019.2-py2.py3-none-any.whl (508kB)
     |████████████████████████████████| 512kB 37.4MB/s
Installing collected packages: sqlparse, pytz, django
Successfully installed django-2.2.4 pytz-2019.2 sqlparse-0.3.0
```


## インストール後の確認

```console
$ pip freeze
Django==2.2.4
pytz==2019.2
sqlparse==0.3.0
```

## MySQLのインストール

弊社ではGCPを使っていることから、MySQLのバージョンは5.7を使用しています。
MacにMySQL5.7のインストール手順は、こちらの[[mac] Homebrewを使ってMySQL5.7をインストールして初期設定](https://qiita.com/Knoth/items/241bd94af722593e685e)を参考にインストールしてください。


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

上記でインストールしたdjangoを使って、プロジェクトの基本セットを作成していきます。

```console
$ django-admin startproject mysite
```

このコマンドは、
先ほどインストールした、djangoコマンド(**django-admin**)を使って
プロジェクトを作成するよ(**startproject**)
プロジェクト名は**mysite**だよ
という意味になります。
※django-adminコマンドはプロジェクト作成時くらいしか登場しません。


作成されたディレクトリは、こんな感じになっています。
<img width="218" alt="スクリーンショット 2019-08-14 2.55.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38197/976b490e-0ce1-2ea3-d223-f20c148e92f9.png">


## mysite
`django-admin startproject mysite`で指定した、`mysite`ディレクトリの中に、ファイルが生成されます。
この名前は、プロジェクト名となります。

## manage.py
Django プロジェクトに対する様々な操作を行うためのコマンドラインユーティリティです｡
プロジェクト作成後は、django-adminではなく、manageコマンドを使っていきます。

## mysite/mysite
mysiteプロジェクトのmysiteパッケージとなります。
呼び出す時に、 `import mysite.urls` のように指定できるようになります。
(ただし、`__init__.py`ファイルがないとパッケージとして認識されないので注意です)

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

## mysite/mysite/settings.py
Django プロジェクトの設定ファイルです。

## mysite/mysite/urls.py
URLの構造を定義するところです。
URLとViewの対応をここで定義します。

## mysite/wsgi.py
プロジェクトを起動するためのWSGI互換Webサーバーとのエントリーポイントです。
こちらの詳細は、今回は割愛します。

#2. 開発用サーバー

## ローカルで起動
manage.pyが配置されているディレクトリで、下記コマンドを実行すると、
簡易サーバが起動します。

```console
$ python manage.py runserver

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 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.

August 14, 2019 - 05:21:51
Django version 2.2.4, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```

この状態で、ブラウザで `http://127.0.0.1:8000/` にアクセスすると下のような画面になれば、成功です！

![django_local2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38197/9dae519a-8877-963e-448e-5286ac60acbb.gif)


## ポートについて
URL`http://127.0.0.1:8000/`に含まれる`8000`はポート番号になります。

ポートとは、通信する時に通るドアみたいなものです。

ポート番号は0-65535番までがあり、大半は既に割り当てられています。[wiki参照](https://ja.wikipedia.org/wiki/TCPやUDPにおけるポート番号の一覧)


例えば、
ブラウザで、`http://xxxxx.com`のようにアクセスするときは、80番を通過します。

`https://xxxxx.com`のように、httpsだと443番を通過します。

同時に、djangoのプログラムを並行起動させたり、
他のプログラムと同時起動させる場合など、ポート番号を変更したい場合があります。

8080番として起動したい場合は、下記のようになります。

```console
$ python manage.py runserver 8080
```

また、IPを指定してアクセスしたい場合、下記のコマンドでローカルIPでアクセスできるようになります。

```console
$ python manage.py runserver 0:8000
```

`0:8000`の`0` は、 `0.0.0.0` のショートカットなので、`0.0.0.0`でも同義です。

runserverは自動的にリロードされます。
コードを修正した場合は、自動的にリロードされるため、再起動の必要はありません。
(エラーが発生した場合など、再起動が必要になる場合もあります)


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

## Polls アプリケーションをつくる
djangoの開発を行う準備が整いました。
[チュートリアル](https://docs.djangoproject.com/ja/2.2/intro/tutorial01/#creating-the-polls-app)に従い、Pollsアプリケーションを作ってみましょう。


manage.py と同じディレクトリに入って、下記のコマンドを実行してみましょう

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

 polls というパッケージと初期セットが作成されます。

![スクリーンショット 2019-08-15 16.33.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38197/e00d664e-d0f8-6adf-2121-18779cadc802.png)


## viewを作成する

polls/views.py を開いて、以下の Python コードを書いてください

```python:polls/views.py
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")
```

このViewは、`"Hello, world. You're at the polls index."`とだけ、レスポンス(出力)するViewとなります。


## urlsを作成する

Viewを実行するには、URLに対応づけする必要があります。
URLを定義するために、polls/urls.pyを作成します。

![スクリーンショット 2019-08-15 16.33.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38197/503fa7ec-533d-0834-6fa0-6a5347fa7af7.png)


```python:polls/urls.py
from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
```

`urlpatterns` に、
 ''(指定なし)でアクセスされると、先ほど作ったviewsのindexを呼ぶ
という定義になります。
指定なしについては、後ほど説明します。



上記で作成したURLの定義を、ルートのURLconfに組み込みます。 
`mysite/urls.py` に `django.urls`のimportに`include`を追加します。
 urlpatterns のリストに `polls`として`include('polls.urls')`('polls.urls'で、polls/urls.pyを意味します)を挿入します。


```python:mysite/urls.py
from django.contrib import admin
from django.urls import include, path

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


ここまでの設定で、ローカルサーバを起動します。

```console
$ python manage.py runserver
```



ブラウザで、`http://127.0.0.1:8000/polls/` にアクセスすると、`polls/views.py`の`index`が呼ばれ、

`"Hello, world. You're at the polls index."`とレスポンスされます。


![スクリーンショット 2019-08-15 17.42.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38197/57d5eebd-f719-144a-3774-ae9b4e07cac2.png)

上記の`''(指定なし)`は、`polls/`以降に何も指定しないと言う意味です。
`polls/index`のように、`index`を必要とする場合には、
`    path('index', views.index, name='index'),`
となります。


### path関数について
path() 関数は4つの引数を受け取ります。引数のうち route と view の2つは必須で、kwargs、name の2つは省略可能です。

---
#### route
route は URL パターンを含む文字列です。リクエストを処理するとき、Django は urlpatterns のはじめのパターンから開始し、リストを順に下に見ていきます。
リクエストされた URL を一致するものを見つけるまで各パターンと比較します。



---
#### view
Django がマッチする正規表現を見つけると、 Django は指定されたview関数を呼び出します。

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

---
#### name
URL に名前付けをしておけば処理中に参照しやすく(扱いやすく）なります。
とくにテンプレートの中で有効です。




# まとめ

ここまでがdjango チュートリアル その１でした。

既にdjangoに触れてる人や、多言語に詳しい人ならわかるけど、初めての人にはわかりにくい部分が多いと思います。
本家のチュートリアルに補足情報を盛り込んだ形で記載しているので理解の手助けになれれば幸いです。

まずは触れてみる事から初めて、徐々に慣れていくと良いかと思います。

チュートリアルやドキュメントは、辞書みたいに詰まったり困った時に、見返してみると理解が徐々に深まるので、初めての人は軽く読み進めるくらいのモチベーションで読んでみてください。

次は、[はじめての Django アプリ作成、その2 -前編-](https://qiita.com/murabo/items/9fc69b419b4415d7dbeb)に読み進めてもらえると幸いです。


<br/>
[PR]
[![長方形-システム開発002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38197/36301a76-6238-c8f4-1cb8-691642889ca0.png)](https://www.co.task.site?pr=qiita)