はじめての Django アプリ作成、その 1¶
さあ、例を交えながら学んでゆきましょう。
このチュートリアルでは、簡単な投票 (poll) アプリケーションの作成に取り組ん でもらいます。
Poll アプリケーションは 2 つの部分からなります:
- ユーザが投票したり結果を表示したりできる公開用サイト
- 投票項目の追加、変更、削除を行うための管理 (admin) サイト
Django は既にインストール済み として説明を進めます。Django がインストールされているかどうか、またどのバージョンがインストールされているかを調べるには、以下のコマンドをシェルプロンプト(先頭の $ は入力待ちを示す記号です)で実行します。
$ python -m django --version
Django がインストールされていれば、インストールされている Django のバージョンがわかります。もしなければ 「No module named django」 とエラーが表示されます。
このチュートリアルは Django 1.11 と Python 3.4 以降を対象に書かれています。 Django のバージョンが合わなければ、このページの右下のバージョンスイッチャーを使用して、インストールされている Django のバージョンのチュートリアルを参照するか、最新の Django にアップデートしてください。 Python 2.7 を使用している場合は、コメントで説明されているように、サンプルコードを調整する必要があります。
Django の旧バージョンを削除して新しいものをインストールする場合は、 Django のインストール方法 が参考になるでしょう。
困ったときは:
このチュートリアルを進めてゆく上で困ったことがあったら、 django-users もしくは irc.freenode.net の #django チャンネル で誰か助けてくれそうな Django ユーザと話してみてください。
プロジェクトを作成する¶
初めて Django を使うのなら、最初のセットアップを行う必要があります。通常は、 Django の プロジェクト (project) を構成するコードを自動生成します。プロジェクトとは、データベースの設定や Django 固有のオプション、アプリケーション固有の設定などといった、個々の Django インスタンスの設定を集めたものです。
コマンドラインから、コードを置きたい場所に cd
して、以下のコマンドを 実行してください。
$ django-admin startproject mysite
これを実行すると、現在のディレクトリに mysite
ディレクトリが作成されます。動作しなければ django-admin 実行時の問題 を参照してください。
注釈
プロジェクトの名前を付けるとき、組み込みの Python モジュールや Django のコンポーネントの名前を使わないようにしてください。とりわけ、 django
(Django 自体と名前が衝突します) や test
(組み込みの Python パッケージ名と名前が衝突します) を使わないようにしましょう。
コードはどこに置くの?
(モダンなフレームワークを使わない) 古いプレーンな PHP の経験があるなら、これまでは Web サーバのドキュメントルート下 (/var/www
といった場所) にコードを配置してきたことでしょう。 Django ではそうしないでください。 Python コードを Web サーバーのドキュメントルート下に置かないでください。コードをドキュメントルート下に置くと、 誰かがコードを Web を介して読めるようになってしまうからです。これは安全上良くありません。
コードはドキュメントルートの外、例えば /home/mycode
の ような場所に置きましょう。
startproject
が何を作成したかをみてみましょう:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
ファイルはそれぞれ以下のような役割を持っています:
- 外側の
mysite/
ルートディレクトリは、このプロジェクトのただの入れ物です。 この名前は Django に関係しませんので、好きな名前に変更できます。 manage.py
: Django プロジェクトに対する様々な操作を行うためのコマンドラインユーティリティです。詳しくは django-admin と manage.py 内のmanage.py
を参照してください。- 内側の
mysite/
ディレクトリは、このプロジェクトの実際の Python パッケージです。この名前が Python パッケージの名前であり、 import の際に 使用する名前です (例えば importmysite.urls
) 。 mysite/__init__.py
: このディレクトリが Python パッケージであることを Python に知らせるための空のファイルです。Python の初心者は、 Python の公式 ドキュメントの more about packages を読んで下さい。mysite/settings.py
: Django プロジェクトの設定ファイルです。 設定の仕組みは Djangoの設定 を参照してください。mysite/urls.py
: Django プロジェクトの URL 宣言、いうなれば Django サイトにおける「目次」に相当します。詳しくは URL ディスパッチャ を参照 してください。mysite/wsgi.py
: プロジェクトをサーブするためのWSGI互換Webサーバーとのエントリーポイントです。詳細は WSGI とともにデプロイするには を参照してください。
開発用サーバー¶
Django のプロジェクトがうまく動作するか確認しましょう。外側の mysite
ディレクトリに移動ができたら下記のコマンドを実行してください:
$ python manage.py runserver
コマンドライン上で下記の出力が確認できるでしょう:
Performing system checks... System check identified no issues (0 silenced). You have unapplied migrations; your app may not work properly until they are applied. Run 'python manage.py migrate' to apply them. 12月 02, 2017 - 15:50:53 Django version 1.11, using settings 'mysite.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
注釈
適用されていないデータベースマイグレーションについての警告はここでは無視します、後ほどすぐにデータベースとともにたっぷりと取り組みます。
これで、 Django 開発サーバを起動しました。 Django 開発サーバは Python だけで書かれた軽量な Web サーバです。このサーバは、開発を迅速に行い、運用に適した状態になるまで Apache のような運用サーバの設定をいじらなくても良いようにするためのものです。
ここでちょっと注意しておきましょう。このサーバは開発中の利用だけを考えて作られています。絶対に運用環境では 使わないでください (筆者たちの専門は Web フレームワークであって、Web サーバではありません)。
さあ、これでサーバが起動したので、ブラウザで http://127.0.0.1:8000/ にアクセスしてみてください。 “Welcome to Django” と表示された、明るいパステル調のライトブルーのページが出るはずです。やりましたね!
ポート番号の変更
デフォルトでは runserver
コマンドは内部 IP のポート 8000 で起動します。
サーバーのポートを変えたい場合は、以下のようにコマンドライン引数を渡してください。このコマンドによってポート 8080 で起動させれます:
$ python manage.py runserver 8080
サーバの IP を指定するときには、ポート番号も一緒に指定します。例えば、 全ての IP からのリクエストを受け付ける (サーバを他のコンピュータから見えるようにする) には、以下のようにします:
$ python manage.py runserver 0:8000
0 は 0.0.0.0 のショートカットです。開発サーバーの詳細な説明は runserver
のリファレンスを参照してください。
runserver
の自動リロード
開発サーバーは必要に応じてリクエストごとにPythonコードを自動的にリロードします。コード変更の効果を得るためにサーバーを再起動する必要はありません。しかしながら、ファイルの追加のようないくつかの行動は再起動をトリガーしません、このような場合はサーバーを再起動する必要があります。
Polls アプリケーションをつくる¶
さあ、これで自分用の環境、すなわちプロジェクトが立ち上がり、作業にとりかかる準備ができました。
Django 内に追加する各アプリケーションは、所定の規約に従った Python パッケージで構成されます。 Django には基本的なディレクトリ構造を自動生成するユーティリティが含まれているので、ディレクトリを作ることではなくコードを書くことに集中できます。
プロジェクトとアプリケーション
プロジェクトとアプリケーションの違いとは何でしょうか?アプリケーションとは、実際に何らかの処理を行う Web アプリケーションを指します。例えばブログシステムや公開レコードのデータベース、単純な投票アプリといった具合です。プロジェクトとは、あるウェブサイト向けに設定とアプリケーションを集めたものです。一つのプロジェクトには複数のアプリケーションを入れられ ます。また、一つのアプリケーションは複数のプロジェクトで使えます。
アプリケーションは Python path のどこにでも置けます。このチュートリアルでは投票アプリケーションを manage.py
のすぐ隣に作ります。なので、 mysite
のサブモジュールとしてでなく、トップレベルのモジュールとしてインポートできます。
アプリケーションを作るには、 manage.py
と同じディレクトリに入って、このコマンドを実行します:
$ python manage.py startapp polls
このコマンドは polls
というディレクトリを作成します。中身はこのようになっています:
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
このディレクトリ構造が、 poll アプリケーションの全体像です。
はじめてのビュー作成¶
最初のビューを書いてみましょう。 polls/views.py
を開いて、以下の Python コードを書いてください:
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
Django で最も単純なビューです。ビューを呼ぶために、 URL を対応付けしてやる必要があります。そのためには URLconf が必要です。
polls ディレクトリに URLconf を作るには urls.py
というファイルを作ります。アプリのディレクトリはこのようになるはずです:
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
urls.py
views.py
polls/urls.py
ファイルには以下のコードを書いてください:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index, name='index'),
]
次のステップはルートのURLconfに polls.urls
モジュールの記述を反映させることです。 mysite/urls.py
に django.conf.urls.include
のimportを追加して、 urlpatterns
のリストに include()
を挿入します。するとこのようになります:
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^polls/', include('polls.urls')),
url(r'^admin/', admin.site.urls),
]
include()
は他の URLconf への参照を許可します。 include()
のための正規表現には $
( 文字列の終わりに一致する文字 ) が含まれず、むしろスラッシュを末尾にもつことを覚えておいてください。Django が include()
に遭遇すると、いつも一致した箇所を URL から切り落とし、次の処理のために残りの文字列を、 インクルードされた URLconf へ渡します。
include()
の背景にある考えは、 URL を簡単にプラグ & プレイ可能にすることです。 polls には独自の URLconf (polls/urls.py
) を持っているので、 「/polls/」 、 「/fun_polls/」 や、 「/content/polls/」 といった、どんなパスルート下にも置けて、どこに置いてもきちんと動作します。
include()
を使うとき
URLパターンをインクルードするときはいつでも include()
を使うべきです。 admin.site.urls
はこれについての唯一の例外です。
自分のレイアウトと違う場合
もし admin.site.urls
ではなく include(admin.site.urls)
になっている場合、おそらくあなたはこのチュートリアルとは違うバージョンの Django を使っています。古いチュートリアルを参照するか、新しいバージョンの Django を入手してください。
これで index
ビューを URLconf に紐付けることができました。下記のコマンドを実行して、動作を確認しましょう:
$ python manage.py runserver
ブラウザで http://localhost:8000/polls/ にアクセスすると、 「Hello, world. You’re at the polls index.」 と表示されるのが確認できるでしょう。これはビューの index
で定義したものです。
url()
関数は4つの引数を受け取ります。引数のうち regex
と view
の2つは必須で、 kwargs
と name
の2つは省略可能です。ここで、これらの引数がどのようなものか見てみましょう。
url()
引数: regex¶
「regex」 という単語は省略形で、一般的に 「regular expression」 という意味があります。これは文字列にマッチするパターンの構文で、この場合はURLパターンにあたります。 Django ははじめの正規表現から開始し、リストを順に下に見ていきます。リクエストされたURLと各正規表現を、マッチするものが見つかるまで比較します。
これらの正規表現はGETやPOSTのパラメーター、そしてドメイン名をサーチ検索しないことに注意します。例えば、 https://www.example.com/myapp/
へのリクエストにおいては、URLconfは myapp/
を見ます。 https://www.example.com/myapp/?page=3
へのリクエストにおいても、URLconfは myapp/
を見ます。
正規表現についてわからないことがあれば Wikipediaのエントリー と re
モジュールのドキュメントを参照してください。オライリーから出版されている Jeffrey Friedl の 「Mastering Regular Expressions」 も参考になります。しかし実際問題としては、正規表現のエキスパートになる必要はありません。単純なパターンをキャプチャする方法を知っていれば十分です。それに複雑な正規表現はルックアップのパフォーマンスが悪いので、正規表現のフルパワーに依存するのはよくありません。
パフォーマンスノート: 正規表現は URLconf モジュールが読み込まれた最初にコンパイルされるので、高速に動作します (先ほど述べたように複雑すぎない場合)。
url()
引数: view¶
Django がマッチする正規表現を見つけると、 Django は指定されたビュー関数を呼び出します。その際は HttpRequest
オブジェクトを第一引数に、そして正規表現で「キャプチャされた」値をその他の引数にして関数を呼び出します。正規表現が単純にキャプチャをしている場合は位置引数として、名前付きでキャプチャしている場合はキーワード引数として呼び出します。この例はこの後すぐ出てきます。
url()
引数: name¶
URL に名前付けをしておけば Django のどこからでも明確に参照でき、とくにテンプレートの中で有効です。この便利な機能のおかげで、プロジェクトのURLにグローバルな変更を加える場合にも1つのファイルを変更するだけで済むようになります。
基本的なリクエストとレスポンスのフローに馴染んだら、データベースを使った作業を始めるために チュートリアルその2 を読みましょう。