【GoogleHomeでメモ帳アプリを作る】2. Djangoのチュートリアルをする

概要

Djangoチュートリアルをやったときのメモ(途中まで)

資料全体の構成はここに記載: GoogleHomeに話しかけてメモを記録したりメモを読み上げてもらう

チュートリアル

はじめての Django アプリ作成、その 1

https://docs.djangoproject.com/ja/2.0/intro/tutorial01/

Django がインストールされているかどうか、またどのバージョンがインストールされているかを調べるには、以下のコマンドをシェルプロンプト(先頭の $ は入力待ちを示す記号です)で実行します。

[~/git/django-tutorial] $python -m django --version                                  (git)-[master]
2.0
[~/git/django-tutorial] $                                                            (git)-[master]

プロジェクトを作成する

初めて Django を使うのなら、最初のセットアップを行う必要があります。通常は、 Django の プロジェクト (project) を構成するコードを自動生成します。プロジェクトとは、データベースの設定や Django 固有のオプション、アプリケーション固有の設定などといった、個々の Django インスタンスの設定を集めたものです。 コマンドラインから、コードを置きたい場所に cd して、以下のコマンドを 実行してください。

実行すると、現在のディレクトリに mysite ディレクトリが作成される

$ django-admin startproject mysite

プロジェクトの名前を付けるとき、組み込みの Python モジュールや Djangoコンポーネントの名前を使わないようにしてください。とりわけ、 django (Django 自体と名前が衝突します) や test (組み込みの Python パッケージ名と名前が衝突します) を使わないようにしましょう。

この時点で以下のファイルができている

[~/git/django-tutorial/tutorial2] $django-admin startproject mysite                  (git)-[master]
[~/git/django-tutorial/tutorial2] $tree                                              (git)-[master]
.
└── mysite
    ├── manage.py
    └── mysite
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py

2 directories, 5 files
[~/git/django-tutorial/tutorial2] $     
各ファイルの意味

外側のmysite - 一番の上のmysite/ ルートディレクトリは、このプロジェクトのただの入れ物です

manage.py - Django プロジェクトに対する様々な操作を行うためのコマンドラインユーティリティです。 - 詳しくは django-admin と manage.py 内の manage.py を参照してください。

内側のmysite - 内側の mysite/ ディレクトリは、このプロジェクトの実際の Python パッケージです。この名前が Python パッケージの名前であり、 import の際に 使用する名前です  -  (例えば import mysite.urls) 。

settings.py - mysite/settings.py: Django プロジェクトの設定ファイルです。  - 設定の仕組みは Djangoの設定 を参照してください。

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

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

プロジェクトを作成する

Django のプロジェクトがうまく動作するか確認しましょう。外側の mysite ディレクトリに移動ができたら下記のコマンドを実行してください

$ python manage.py runserver

実行結果

[~/git/django-tutorial/tutorial2/mysite] $python manage.py runserver                 (git)-[master]
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.

February 02, 2018 - 14:44:21
Django version 2.0, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

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. と出ているが

適用されていないデータベースマイグレーションについての警告はここでは無視します、後ほどすぐにデータベースとともにたっぷりと取り組みます。

チュートリアルに書いてあるので上の警告は無視してOK

注意

このサーバは開発中の利用だけを考えて作られています。絶対に運用環境では 使わないでください (筆者たちの専門は Web フレームワークであって、Web サーバではありません)。

これで http://localhost:8000/ にアクセスするとちゃんと見られた → 「The install worked successfully! Congratulations!」 の画面が出た

django_installworked

runserverについて

https://docs.djangoproject.com/ja/2.0/ref/django-admin/#runserver

デフォルトの IP アドレス 127.0.0.1 は、同じネットワーク上の他のマシンからはアクセスできないことに注意してください。開発用サーバーを他のマシンから見られるようにするには、ネットワーク上の自分のローカル IP アドレス (例 192.168.2.1) または 0.0.0.0 や :: (IPv6 が有効な場合) を使用してください。

サーバーのポートを変えたい場合は、以下のようにコマンドライン引数を渡してください。このコマンドによってポート 8080 で起動させれます:

$ python manage.py runserver 8080

のように、ポート番号を変えることもできる

これで http://localhost:8080/ にアクセスすると上と同じ画面が得られる

サーバの IP を指定するときには、ポート番号も一緒に指定します。 例えば、 全ての IP からのリクエストを受け付ける (サーバを他のコンピュータから見えるようにする) には、以下のようにします:

$ python manage.py runserver 0:5000

上記のWebサーバは仮想マシンUbuntuに立てたが、ホストマシンのWindowsからも見られるはず ※自分のUbuntuでは以下の通り5000と8181のポートのみアクセスを受け付けるようにファイアウォールを設定しているので、 ここではポートを5000とした

自分の環境のubuntuufwの設定

[~/git/django-tutorial/tutorial/mysite] $sudo ufw status                             (git)-[master]
状態: アクティブ

To                         Action      From
--                         ------      ----
8181                       ALLOW       Anywhere
80                         ALLOW       Anywhere
5000                       ALLOW       Anywhere

[~/git/django-tutorial/tutorial/mysite] $  
Ubuntuで立てたDjangoのWebサーバにホストOSのWindowsからアクセスしてみる

さて、これでホストOSのWindowsからゲストOSで立ち上げたUbuntuのサーバが、IPアドレスとポート5000を指定して見られるはず。。 http://192.168.3.11:5000/ あれ・・・ 見られない

ALLOWED_HOSTSについて - https://docs.djangoproject.com/ja/2.0/ref/settings/#allowed-hosts

[~/git/django-tutorial/tutorial2/mysite/mysite/settings.py   
# SECURITY WARNING: don't run with debug turned on in production!   
DEBUG = True    
    
#ALLOWED_HOSTS = []                                                     
ALLOWED_HOSTS = ['localhost', '127.0.0.1', '[::1]', '192.168.3.11'] ← ここを変える

改めて実行するとWindowsからも見られた

Polls アプリケーションをつくる

チュートリアルではPollsというWebアプリケーションを作る様になっているので、それにしたがってアプリケーションを作成する

プロジェクトとアプリケーション

アプリケーションとは

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

プロジェクトとは

プロジェクトとは、あるウェブサイト向けに設定とアプリケーションを集めたものです。 一つのプロジェクトには複数のアプリケーションを入れられ ます。また、一つのアプリケーションは複数のプロジェクトで使えます。

アプリケーションを作るには、 manage.py と同じディレクトリに入って、このコマンドを実行します:

[~/git/django-tutorial/mysite] $  python manage.py startapp polls

このコマンドは polls というディレクトリを作成します。中身はこのようになっています:

[~/git/django-tutorial/tutorial2/mysite] $ls                                                                        (git)-[master]
db.sqlite3  manage.py*  mysite/
[~/git/django-tutorial/tutorial2/mysite] $python manage.py startapp polls                                           (git)-[master]
[~/git/django-tutorial/tutorial2/mysite] $tree                                                                      (git)-[master]
.
├── db.sqlite3
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-36.pyc
│   │   ├── settings.cpython-36.pyc
│   │   ├── urls.cpython-36.pyc
│   │   └── wsgi.cpython-36.pyc
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── polls
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

4 directories, 17 files
[~/git/django-tutorial/tutorial2/mysite] $ 

Django で最も単純なビューを作成する

[~/git/django-tutorial/tutorial2/mysite] $cat polls/views.py                                                        (git)-[master]
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")
[~/git/django-tutorial/tutorial2/mysite] $ 

ビューを呼ぶために、 URL を対応付けしてやる必要があります。そのためには URLconf が必要です。 ← 重要

[~/git/django-tutorial/tutorial2/mysite] $cat polls/urls.py                                                         (git)-[master]
from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
[~/git/django-tutorial/tutorial2/mysite] $

ルートのURLconfに polls.urls モジュールの記述を反映させることが必要

mysite/mysite/urls.py に以下を記載

from django.urls import include, path  ← includeを追加
from django.contrib import admin    
    
urlpatterns = [ 
    path('polls/', include('polls.urls')),    ← 追加
    path('admin/', admin.site.urls),   
]   
注意

URLパターンをインクルードするときはいつでも include() を使うべきです。

Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))

ここまでしたらWebサーバを立ち上げる

[~/git/django-tutorial/mysite] $ python manage.py runserver

ブラウザで http://localhost:8000/polls/

で 「Hello, world. You're at the polls index.」 が表示される

django_hello

先程の復習だが、以下のように、0:5000としてやれば、Windowsからも見られる $python manage.py runserver 0:5000

参考 - https://qiita.com/kqxgy385/items/466b5bab67118175be65 - https://qiita.com/kaki_k/items/b76acaeab8a9d935c35c

ここまですると、DjangoでWebサーバを作るのに必要な最低限の知識が得られる

このあとのチュートリアル02以降は、Webアプリケーションのページを作成する手順が多いので、 サーバを立てるだけであればここまでで十分かも

やったけど、ここには記載しない

djangoについて参考にしたページ

https://docs.djangoproject.com/ja/2.0/intro/tutorial01/

https://qiita.com/gctfuji/items/27d2c9e4b3334447b6af

http://qh73xebitbucketorg.readthedocs.io/ja/latest/1.Programmings/python/LIB/django/tutorial/main/

https://qiita.com/yakan10/items/b7ad35c2cbba5db81462