Djangoを使ってみる#1

#概要
Python"ガチ"初心者がDjangoでWebサーバを構築するまで。

##環境
+ Windows10 home
+ Anaconda 5.0.1 (Just meでインストール)
+ Python 3.6.3 :: Anaconda, Inc.
+ Django2.0

##参考
こちらの記事を参考にさせていただきました。
[はじめての Django アプリ作成、その 1](https://docs.djangoproject.com/ja/1.11/intro/tutorial01/)

#手順
##Djangoのインストール

```Python:コマンド
> pip install Django==2.0
Collecting Django==2.0
  Downloading Django-2.0-py3-none-any.whl (7.1MB)
    100% |████████████████████████████████| 7.1MB 6.6MB/s
Requirement already satisfied: pytz in c:\users\xxxxx\anaconda3\lib\site-packages (from Django==2.0)
Installing collected packages: Django
Successfully installed Django-2.0
```

##バージョン確認
Pythonインタプリンタで次のコードを実行します。

```Python:コード
>>> import django
>>> print(django.get_version())
2.0
```

もしくは以下でもOK。

```Python:コード
> python -m django --version
2.0
```
##プロジェクト作成
任意の作業ディレクトリにて以下のコマンドを実行します。

```Python:コマンド
> django-admin startproject mysite
```
作業ディレクトリ配下にmysiteディレクトリが作成されます。
ディレクトリ構造は以下のようになります。

```Python:ディレクトリ
mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py
```
このサーバの設定スクリプトと（まだ作成してませんが）アプリケーション（のスクリプト）をひとまとめにしたものをプロジェクトと呼ぶようです。

[こちら](https://docs.djangoproject.com/ja/1.11/intro/tutorial01/)から引用するとこのように書いてあります。
>プロジェクトとは、あるウェブサイト向けにとアプリケーションを集めたものです。一つのプロジェクトには複数のアプリケーションを入れられ ます。また、一つのアプリケーションは複数のプロジェクトで使えます。

この連載では最上層のmysite（以下、ルートディレクトリ）がc:直下に配置する前提でプロジェクトを作成していきます。

##開発用サーバ起動確認
ルートディレクトリに移動して以下のコマンドを実行します。

```Python:コマンド
> python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).

You have 14 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.
December 29, 2017 - 16:12:09
Django version 2.0, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
[29/Dec/2017 16:12:26] "GET / HTTP/1.1" 200 16559
[29/Dec/2017 16:12:26] "GET /static/admin/css/fonts.css HTTP/1.1" 200 423
[29/Dec/2017 16:12:26] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 200 80304
[29/Dec/2017 16:12:26] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 200 82564
[29/Dec/2017 16:12:26] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 200 81348
Not Found: /favicon.ico
[29/Dec/2017 16:12:26] "GET /favicon.ico HTTP/1.1" 404 1972
```
これでサーバが起動されます。起動していれば、http://127.0.0.1:8000/ にブラウザでアクセスすると次のようなページにアクセスできます。なんかかわいい。

<img width="945" alt="サーバ起動.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/211712/267b1f5f-61b0-0a03-0a24-abc924bfa715.png">

サーバのIPアドレスとポートを指定する場合は次のコマンドでサーバを起動します。

```Python:コマンド
> python manage.py runserver IPアドレス:ポート番号
```
サーバを止めるときは`ctrl + c`で止めます。

##Hello World!を表示させる
まず、アプリを作成します。ルートディレクトリにて以下のコマンドを実行します。

```django:ディレクトリ
>python manage.py startapp myapp
```

するとディレクトリが生成され、下記のような構成になります。

```django:ディレクトリ
mysite/
    manage.py
    myapp/
       migrations
       __init__.py
       admin.py
       apps.py
       models.py
       tests.py
       views.py
    nysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py
```
まずはHello World!を実行するスクリプトを作成します。
myappにあるviews.pyを編集します。

```Python:mysite/myapp/views.py
from django.http import HttpResponse
def index(request):
	return HttpResponse('Hello World!')
```
index関数はrequestオブジェクトを引数に受け取り、HttpResponseオブジェクトを返す関数です。

次にmysite/setting.pyを編集してmyappアプリケーションを読み込むように設定します。INSTALLED_APPSの中に`myapp`を追加します。

```Python:mysite/setting.py
…
# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp'　#ここを追加
]
…
```

さらに、mysite/urls.pyを編集して、URLとviewの対応をマッピングします。urlpatternsに`(r'^$','myapp.views.index'),`を追加します。

```Python:mysite/urls.py
…
from django.contrib import admin
from django.urls import path
from django.conf.urls import url　#ここを追加
from .myapp import views　#ここを追加

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^$',views.index),　#ここを追加
]
```

##HTMLとして表示
テンプレートシステムを介してHTMLの表示を行います。
次のディレクトリとhtmlを作成します。

```Python:mysite/myapp/templates/myapp/index.html
<html>
<body>
{{message}}
</body>
</html>
```
Hello Djangoを返すviewを作ります。mysite/myapp/views.pyを次のように編集します。

```Python:mysite/myapp/views.py
from django.http import HttpResponse
from django.template import loader, RequestContext
def index(request):
	contexts = {
		'message':'Hello Django',
	}
	template = loader.get_template('myapp/index.html')
	return HttpResponse(template.render(contexts))
```
RequestContextオブジェクトを作成し、テンプレートに代入する変数を定義します。そしてloader.get_templateでテンプレートを呼び出し、renderメソッドでテンプレートと変数を結びつけます。


***
以上で基本的な開発用Webサーバの構築ができました。