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

さあ、例を交えながら学んでゆきましょう。

このチュートリアルでは、簡単な投票 (poll) アプリケーションの作成に取り組ん でもらいます。

Poll アプリケーションは 2 つの部分からなります:

  • ユーザが投票したり結果を表示したりできる公開用サイト

  • 投票項目の追加、変更、削除を行うための管理 (admin) サイト

Django は既にインストール済み として、説明を進めます。 Django がインストールされている、どのバージョンか調べるには、以下のコマンドを実行します:

$ python -m django --version

Django がインストールされていれば、インストールされている Django のバージョンがわかります。もしなければ “No module named django” とエラーが表示されます。

このチュートリアルは Django 1.10 と 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 ディレクトリが作成されます。動作しなければ Problems running 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 and manage.py 内の manage.py を参照してください。

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

  • mysite/__init__.py: このディレクトリが Python パッケージであることを Python に知らせるための空のファイルです。Python の初心者は、 Python の公式 ドキュメントの more about packages を読んで下さい。

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

  • mysite/urls.py: Django プロジェクトの URL 宣言、いうなれば Django サイトにおける「目次」に相当します。詳しくは URL dispatcher を参照 してください。

  • 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.

4月 04, 2017 - 15:50:53
Django version 1.10, 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.0.0.0:8000

開発サーバーの詳細な説明は 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 コードを書いてください:

polls/views.py
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 ファイルには以下のコードを書いてください:

polls/urls.py
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
]

次のステップはルートのURLconfに polls.urls モジュールの記述を反映させることです。 mysite/urls.pydjango.conf.urls.include のimportを追加して、 urlpatterns のリストに include() を挿入します。するとこのようになります:

mysite/urls.py
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() は他の URLconfs への参照を許可します。 include() のための正規表現は、 $ ( 文字列の終わりに一致する文字 ) よりもむしろトレイリングスラッシュとなることを覚えておいてください。Django が include() に遭遇すると、いつも一致した箇所を URL から切り落とし、次の処理のために残りの文字列を include された 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 を入手してください。

これで”index”ビューをURLconfに接続を接続しました。下記のコマンドを実行して、動作を確認しましょう:

$ python manage.py runserver

ブラウザで http://localhost:8000/polls/ にアクセスすると、”Hello, world. You’re at the polls index.” と表示されるのが確認できるでしょう。これはビューの``index``で定義したものです。

url() 関数は4つの引数を受け取り、そのうち2つが必須です。 regexview 、オプションで kwargsname です。ここで引数が何のためにあるものかを見ておきましょう。

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 モジュールのドキュメントを参照してください。オライリーから出版されている Jeffery Friendl の “Mastering Reglar Expressions” も参考になります。しかし実際問題としては、正規表現のエキスパートになる必要はありません。単純なパターンをキャプチャする方法を知っていれば十分です。それに複雑な正規表現はルックアップのパフォーマンスが悪いので、正規表現のフルパワーに依存するのはよくありません。

パフォーマンスノート: 正規表現は URLconf モジュールが読み込まれた最初にコンパイルされるので、高速に動作します (先ほど述べたように複雑すぎない場合)。

url() 引数: view

Django がマッチする正規表現を見つけると、 Django は所定のビュー関数を呼び出します。その際は HttpRequest オブジェクトを第一引数に、その他、正規表現から「キャプチャされた」値を他の引数に関数を呼び出します。正規表現が単純にキャプチャをしている場合は位置引数として、名前付きでキャプチャしている場合はキーワード引数として呼び出します。少し例を提示します。

url() 引数: kwargs

任意のキーワード引数を辞書として対象のビューに渡せます。この機能はチュートリアルでは使いません。

url() 引数: name

URL に名前付けをしておけば Django のどこからでも明確に参照でき、とくにテンプレートの中で有効です。この便利な機能のおかげで、プロジェクトのURLにグローバルな変更を加える場合にも1つのファイルを変更するだけで済むようになります。

基本的なリクエストとレスポンスのフローがお好みの場合は、データベースを使った作業を始めるために チュートリアルその2 を読みましょう。

Back to Top