Django#1（初期設定とhello）

# Djangoの初期設定

もう出尽くしてる内容ですが、主に自分用にDjangoの初期設定のまとめ
インストールからアプリの作成とHello Worldをとりあえず表示するとこまで記述。

## プロジェクトフォルダの作成

名称（new_project）は任意。

```bash
$ mkdir new_project
$ cd new_project
```

## python（必要に応じて）

他のpython環境からの影響を排除するため、隔離環境にする。下記はpyenvがインストールされてる前提。
プロジェクトフォルダ（new_project）内にローカルのpythonとパッケージ環境を設定する。

```bash
$ pyenv local 3.6.3
$ python -m venv venv
$ source venv/bin/activate
```

ここから下の手順でうまくいかない場合、原因は十中八九、

```bash
$ source venv/bin/activate
```

を実行し忘れてる。（自戒メモ）

## Djangoのインストール

Django本体はpipでインストールする

```bash
$ pip install Django==2.1.8
```


## プロジェクトの作成

プロジェクトのフォルダ（new_project）内で下記を実行。
configフォルダ内にurls.py等のファイルが作成される

```bash
$ django-admin startproject config .
```

## 起動確認

とりあえず起動してホームページが見れることを確認する。
IPアドレスは127.0.0.1や0.0.0.0だとローカルからしか見れないので
リモートから確認する場合はちゃんとしたアドレスを指定する

まずconfig/settings.pyを修正する

```bash
$ vi config/settings.py
```

変更内容

```diff:config/settings.py
28c28
< ALLOWED_HOSTS = []
---
> ALLOWED_HOSTS = ['*']
```

Djangoを起動する

```bash
$ python manage.py runserver IPアドレス:8000
```

ブラウザから上記のアドレス：ポートで下記のような画面が表示されれば起動確認はOK

![django_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170209/6ab9457f-a47b-1d8a-0021-9347ba903c81.jpeg)

ここで、sqlite3のバージョンでこけた場合は下記手順で更新する。

[Amazon Linux 2でSQLite3を最新バージョンにする \- Qiita](https://qiita.com/kai_kou/items/c18b68a7916251231f6d)

```
sudo libtool --finish /usr/lib
```

## adminページの確認

adminページの表示を確認する。
まずはadminユーザーを作成する。ユーザー名とパスワードを任意で設定する。
下記手順中、サービスは起動したままでもOK（自動で再読み込みする）

```bash
$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py createsuperuser
```

WEBブラウザから`http://IPアドレス:8000/admin/`を表示する。
下記のような画像が表示されるので、先に作ったadminアカウントでログインする。

![django_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170209/38c82a72-545a-9ca8-b6ea-0cfa15d33795.jpeg)

ログイン後、下記のような画面が表示されればOK

![django_03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170209/78cf71e7-ee7f-d1f6-e1ef-139245fe65d3.jpeg)

## アプリの作成

### Djangoにおけるアプリとは

Djangoでのアプリとは一つの機能（アカウント管理、工数管理など）を表す。
URL的には第一階層？下記の「アプリ名」に該当する部分に相当する。
http://IPアドレス/アプリ名/

アプリの作成は動作確認までに下記のファイルの編集が必要になる。

- config/settings.py
- config/urls.py
- アプリフォルダ/urls.py
- アプリフォルダ/views.py

アプリの名前を`app_name`とすると、下記コマンドでアプリのフォルダと主だったファイルが作成される。

```bash
 $ python manage.py startapp app_name
```

### INSTALLED_APPSの設定

アプリを作成してもDjangoは自動的に認識しれくれない。
config/setting.pyのINSTALLED_APPSに作成したアプリを追記する必要がある。

```diff:config/settings.py
39a40
>     'app_name',
```

### config/urls.pyの設定

アクセスされたURLとそれを処理する関数との対応付けは`urls.py`に書く。
大元は`config/urls.py`で管理するが、includeをimportすることで
各アプリフォルダ内のurl.pyに分散して記述・管理できる。

```diff:config/urls.py
17c17
< from django.urls import path
---
> from django.urls import include, path
20a21
>     path('app_name/', include('app_name.urls')),
```

上記、最終行の「path('app_name/', ～～」の箇所が
URL上のディレクトリ（http://IPアドレス/app_name/）と
それに対応する処理（この場合は「app_nameフォルダのurls.py参照」）を紐づけている。

### app_name/urls.pyの設定

次に、アプリ内のurls.pyを設定する。
自動で作成されないので新規で下記のように入力する。

```python:app_name/urls.py
from django.urls import path
from . import views

app_name = 'app_name'

urlpatterns = [
    path('', views.hello, name='hello'),
    # path('func1/', views.func1, name='func1'),
    # path('func2/', views.func2, name='func2'),
]
```

上記の`path('', views.hello, name='hello')`

- 第1引数の`''`はURLのapp_name/以下のパスを指定する。
  - この引数に合致するURLへのアクセスに対して、第2引数で指定した関数が処理を行う
- 第2引数の`vies.hello`はアクセスに対する処理としてviews.py内のhello関数を実行するという意味
- 第3引数の`name=hello()`はこの設定の名前。

同様に（コメントアウトしているが）
app_name/func1/へのアクセスに対してはビュー関数func1
app_name/func2/へのアクセスに対してはビュー関数func2
がそれぞれ処理するという意味になる。

ビュー関数とは「HTTPのGETとかPUTとかに対してレスポンスを返す関数」である。

### ビュー関数を書く

先の手順でビュー関数として「hello」と記述したが、
それに該当するhelloという名前の関数を実際にはどこに定義するかというと、
アプリフォルダ内のviews.pyに同一名称の関数として記述する。

requestを受け取って、returnでHTTPを返せばよい。
シンプルな記述としては下記のようになる。

```python:app_name/views.py
from django.http import HttpResponse
from django.shortcuts import render

# Create your views here.
def hello(request):
      return HttpResponse('Hello, World !!')
```

### 動作確認

WEBブラウザでhttp://IPアドレス:8000/app_name/にアクセスする。
下記のような文字が表示されればOK

![django_04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170209/a3c372d8-c246-9b10-f45d-c628474794a2.jpeg)