Django 入門 2

#Web上で"Hello World"を表示させてみる
Hello World Appというwebアプリケーションを作成して，"Hello World"を表示してみます．
##初期設定
まず任意のディレクトリに移動し，helloworldという名前(何でもいい)のディレクトリを作成し，そのディレクトリへ移動する．そして仮想環境をに入り，次のコマンドを実行して新規Djangoプロジェクトを作成する．

```
$ django-admin startproject helloworld_project .
# django-admin.py: 新規プロジェクトに必要なディレクトリとファイルを作成するスクリプト
# helloworld_progect: プロジェクト名なので何でも良い
```

helloworld_projectディレクトリが作成される．ディレクトリ内には次のファイルが存在している．

```
├── helloworld
    ├── manage.py          #Django プロジェクトに対する様々な操作を行うためのコマンドラインユーティリティ．
    ├── helloworld_project
        ├── __init__.py    #このディレクトリが Python パッケージであることを Python に知らせるための空のファイル
        ├── asgi.py        #プロジェクトを提供する ASGI 互換 Web サーバーのエントリポイント
        ├── settings.py    #プロジェクトの設定を制御
        ├── urls.py        #urlresolver(リクエストで受け取ったurlに対応するビューを見つける仕組み)で使用されるパターンのリストを含む．
        └── wsgi.py        #wsgi:サーバとWebアプリケーションをつなぐ共通のインターフェースを定義したもの
```

##Appの作成
helloworld_projectという新規プロジェクトにapp(機能)を追加，作成していく．appと聞くと，一般的にはLINE,Twitter,Instgramみたいなものを想像してしまいがちですが，Djangoにおけるappとは，機能のことを指す．たくさんの機能が協力しあってLINEとかができています．
一つのDjangoプロジェクトは一つ以上のappを含み，互いに協力し合ってサービスを提供しています．例えば，e-commerceサイトでは
- ユーザ認証
- 支払い
- 商品表示
- ect.
など様々なappが共存することで一つのサービスを提供しています．
説明はここまでにしておいて，さっそくappを作成していきます．

###appの新規作成
まず，サーバを起動している場合は，Control+cで停止させてください．
次のコマンドを実行して"pages"という名前のappを作成します．

```
$ python manage.py startapp pages
```
すると，/helloworld/pagesディレクトリが作成されます．

```
├── pages
    ├── __init__.py      
    ├── admin.py        #adminにいての設定ファイル
    ├── apps.py         #pagesというapp自体の設定ファイル
    ├── migrations      #model.pyファイルの変更履歴を保存し，データベースとmodels.pyを同期させておくためのファイルを格納するディレクトリ
    │   └── __init__.py
    ├── models.py       #appのモデルファイル．データベースモデルを定義するファイル．
    ├── tests.py        #appのテストファイル
    └── views.py        #appのビューファイル．appに対するリクエストやレスポンスを処理するファイル．
```
pagesというappをDjangoのプロジェクト(helloworld)内に作成したのですが，Djangoはまだpagesがappなのか何なのかわかっていない状態です．Djangoにpagesというappを使うことを伝えておかないといけません．
helloworld_project/settings.pyを開いてみてみると，次のような箇所があります．

```
# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
```

これらはデフォルトで存在しているDjangoのappです．ここにpagesを追加して初めて自作のappをDjangoプロジェクトに加えることができます．
次の１行を書き加えます．

```
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'pages.apps.PagesConfig', # new
]
```

自作のappは常に一番下に書き加えていかないといけません．DjangoはINSTALLED_APPSの設定を上から下へ実行していくためです．adminのappを最初にロードし，次にauth，次に...の順にならないといけません．理由は，自作のappはadmiなどの機能に依存したものとなることが大半だからです．

###ビューの編集
次に，views.pyに文字列を表示させるためのコードを追加します．

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

def homePageView(request):
    return HttpResponse('Hello, World!')
    #homePgeViewという関数はrequestを受け取るとHttpResponseという関数を呼び出して得た値をreturnする
    #今回は'Hello, World!'という文字列を表示させるようなレスポンスを返している．
```

そもそもビューとは，モデル(model.py)に対してデータのなどの情報を要求します．そしてモデルはビューに要求されたデータをテンプレートに渡します．つまり，ビュー(view.py)はリクエストを受けとって，レスポンスを返すPythonの関数です．

- レスポンス: WebページのHTMLコンテンツ，リダイレクト，404エラー，XMLドキュメントなど何にでもなり得る

**ビュー(view.py)は基本的にはHttpResponseオブジェクトを返さないといけないことに注意．(例外もあり)**

>Django は、システム全体にわたって、リクエストとレスポンスオブジェクトを使っ て処理状態を受け渡します。
あるページへのリクエストを受け取ると、Django は HttpRequest オブジェクトを生成します。このオブジェク トにはリクエストのメタデータが入っています。次に Django は適切なビューをロー ドして、 HttpRequest をビュー関数の最初の引数に渡しま す。各ビューは HttpResponse オブジェクトを返さねばなりません。
https://djangoproject.jp/doc/ja/1.0/ref/request-response.html


###URLの設定
次にURLの設定です．今から２つの(①，②)urls.pyファイルに触れることになるので，違いを意識しながら頑張りましょう．

①
pages/urls.pyというファイルを作成してください．(**カレントディレクトリに注意してください．pagesディレクトリ内です．**)
以下のコードを追記してください．

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

urlpatterns = [
    path('', homePageView, name='home')
]
#DjangoはURLのドメイン名(http://127.0.0.1:8000/の部分)を無視するので，このURLパターンは空の文字列('')に一致する
```

上のコードは，127.0.0.1:8000というアドレス(最初のページのアドレス)にアクセスしたら，homePageViewというビュー関数を呼び出すようにしなさい，ということを意味しています．
name='home'はビューを識別するために使われるURLの名前です．今後このURLの名前を使う機会が出てくるので，覚えやすくて，ユニークな名前をつけておくと混乱しなくてすみます．

②
helloworld_progect/urls.pyというファイルがデフォルトで作成されているはずです．ここに以下のコードを追記してください．

```python:helloworld_project/urls.py
from django.contrib import admin
from django.urls import path, include #new

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('pages.urls')), #new
]
# ①と同様に，URLパターンを空の文字列('')に指定して，http://127.0.0.1:8000/ というドメインのみのアドレスを入口ページとしている．
```

pages.urlsをインポートするためにinclude関数というものをインポートしておく．
'admin/'を指定しているpath()では、URLが「admin/」の場合に、管理画面（admin.site.urls）を返す（ブラウザに表示する）ように設定している．管理画面はappをブラウザで操作できるページ．
Djangoは入口ページに来たリクエストはpages.urlsへリダイレクトするようになる．つまり，入口ページにアクセスしたら，自動的にpages.urlsのhomePageView関数が実行されるようにしている．


###Hello World完成
以上でwebサイトにHello, World!を表示させる準備が整いました．あとはサーバを立ち上げるだけ．

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

<img width="1680" alt="Screen Shot 2020-03-26 at 10.45.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391974/67007d75-733b-7189-b500-48ae1e993a02.png">


#参考資料
Django for Beginners 3.0