Source

djangobook-cn / docs / _build / pickle / _sources / 2.0 / chapter03.txt

Full commit
.. _2.0-chapter03:

======================
第3章: View と URLconf
======================

前章で、私たちは Django プロジェクトを作成し、
Django 開発用サーバを起動する方法を解説しました。
この章では、Django で動的なWebページを作成するための基本を学びます。

初めての Django で動作するページ: Hello World
---------------------------------------------

私たちの最初の目標として、
決まり文句 "Hello World" を出力するWebページを作ってみましょう。

もしあなたが、Webフレームワークを使わずに、
単純に "Hello World" と出力するだけのWebページを作成した場合は、
単純に "Hello World" と書いたテキストファイルを `hello.html` 
等の名前で保存し、
Webサーバ内のディレクトリーにアップロードするだけです。

このプロセスで、あなたはWebページに関する2つの重要な情報を
決定していることに注目してください。
その内容("Hello World"という文字列)と、
そのURL( `http://www.example.com/hello.html
<http://www.example.com/hello.html>`_ もしくは、
あなたがサブディレクトリーにアップロードしたのであれば、
おそらく `http://www.example.com/files/hello.html
<http://www.example.com/files/hello.html>`_ )です。

Django では、同様に2つの情報を指定しますが、
指定方法が異なっています。
ページの内容は *View 関数* が生成し、
URL は *URLconfs* で指定します。
最初に、私たちの "Hello World" View 関数を書いてみましょう。

初めての View
~~~~~~~~~~~~~

前章で、 `django-admin.py startproject` により作成した `mysite` ディレクトリー内に、 
`views.py` という名前のファイルを作成してください。
この Python モジュールは、この章の View に該当しています。 
`views.py` という名前に特別な意味はないので注意してください - 
もう少し後で解説しますが、Django にファイルの名前は関係ありません。
しかし、これは `views.py` と呼ぶのが慣習であり、
あなたのコードを他の開発者が読みやすいため、良い考えです。

私たちの "Hello World" View 関数は非常に単純です。
ここに、 
`import` 宣言を含む全ての関数があるので、
あなたはこれを `views.py` に入力する必要があります。

.. sourcecode:: python
    
    from django.http import HttpResponse

    def hello(request):
        return HttpResponse("Hello world")

このコードの各行ごとに、そのステップを解説します。

* 最初の行で、私たちは `django.http` モジュール内にある 
  `HttpResponse` クラスをインポートしています。
  私たちはこのクラスをコード内で利用するので、
  それをインポートする必要があります。

* 次の行で、 `hello` という名前の関数を定義しています - View 関数

  各 View 関数は、少なくとも1つ以上の引数を受け取り、
  慣習では `request` という名前が使われています。
  これは、この View を呼び出した Web リクエストに関する情報を含んでおり、
  それは `django.http.HttpRequest` クラスのインスタンスです。
  この例では、私たちは `request` に対して何も操作していませんが、
  それは View 関数の最初の引数である必要があります。

  View 関数の名前に特別な意味はないので注意してください; 
  それを Django に通知するために特定の規則に基づく名前を付ける必要はありません。
  私たちは、View の目的を明確に示すために `hello` という名前にしていますが、
  それは、 `hello_wonderful_beautiful_world` 、または他の名前を付けることもできます。
  次の "はじめての URLconf" セクションでは、
  Django がどのようにしてこの機能を見つけるかに光を当てます。

* 最後の行は、この関数の(1行の単純な)処理です; 
  それは単に "Hello World" という文字列を引数とした、 `HttpResponse` 
  オブジェクトを返すだけです。

主なレッスンは以下の通りです:
View はただの Python 関数であり、
最初の引数として、 `HttpRequest` を受け取り、 
`HttpResponse` インスタンスを返します。
Django の View は、Python の関数であるため、
2点に注意する必要があります。
(これについては、例外として後ほど解説します。)

初めての URLconf
~~~~~~~~~~~~~~~~

もしこの時点で、あなたが再び `python manage.py runserver` を実行しても、
私たちの "Hello World" というメッセージはどこにも表示されず、
まだ "Welcome to Django" というメッセージが表示されます。
なぜなら、私たちの `mysite` プロジェクトが、
まだ `hello` View を知らないからです。
私たちは、 Django に対し、
特定の URL で、どの View を呼び出すかを明確に指定する必要があります。
(上記の、静的な HTML ファイルを公開する例でいうところの、
HTMLの作成を終え、まだディレクトリーにアップロードされていない状態と類比しています。)
Django で、特定の URL に View をフックするためには、URLconf を利用します。

URLconf は、あなたの Django ベースの Web サイトの目次のようなものです。
その基本動作は、URL パターンと、
そのURL パターンで呼び出される View 関数をマッピングします。
それはあなたが、
「この URL はこの関数を呼ぶ、その URL はその関数を呼ぶ」という風に Django に伝えます。
例えば、
「誰かが URL `/foo/` を表示したら、 
Python モジュール `views.py` の `foo_view()` という View 関数を呼ぶ」という風に伝えます。

あなたが、前章で `django-admin.py startproject` を実行した時に、
このスクリプトが自動的にあなたの URLconf を作成しました: 
`urls.py` ファイル。
デフォルトでは、このようになっているでしょう。

.. sourcecode:: python

    from django.conf.urls.defaults import *

    # Uncomment the next two lines to enable the admin:
    # from django.contrib import admin
    # admin.autodiscover()

    urlpatterns = patterns('',
        # Example:
        # (r'^mysite/', include('mysite.foo.urls')),

        # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
        # to INSTALLED_APPS to enable admin documentation:
        # (r'^admin/doc/', include('django.contrib.admindocs.urls')),

        # Uncomment the next line to enable the admin:
        # (r'^admin/', include(admin.site.urls)),
    )

デフォルトの URLconf には、
一般的に使われるいくつかの Django 機能がコメントアウトされているので、
その機能の起動はとても簡単で、該当の行をコメントアウトするだけです。
コメントアウトされているコードを除くと、
URLconf に必要不可欠な部分はここです:

.. sourcecode:: python

    from django.conf.urls.defaults import *

    urlpatterns = patterns('',
    )

このコードの各行ごとに、そのステップを解説します。

* 最初の行は、Django の URLconf 基盤である 
  `django.conf.urls.defaults` 内のすべてのモジュールをインポートしています。
  これには、 `patterns` という名前の関数が含まれています。

* 次の行は、 `patterns` 関数で、
  その戻り値を `urlpatterns` という変数に格納しています。 
  `patterns` 関数はひとつだけ引数を受け取っています - 
  例では空文字です。
  (この文字列は、View 関数にプレフィクス (prefix) 引数を渡すために用いますが、
  私たちは今のところこの上級テクニックの解説はしません。)

ここで注意すべき重要なことは、
Django は、あなたの URLconf モジュールから 
`urlpatterns` 変数を探すということです。
この変数は、URL と、
その URL から呼び出すコード(例えば View 関数)のマッピングを定義します。
デフォルトでは、私たちが見たとおり、URLconf は空です - 
あなたの Django アプリケーションはまっさらの状態(Blank Slate)です。
(脚注として、この状態は前章にあるように "Welcome to Django" ページを表示します。
あなたの URLconf が空の場合、
Django はあなたが新しいプロジェクトを始めたばかりと仮定し、
そのメッセージを表示します。)

URLconf に、URL と View 関数を追加するには、
URL パターンから View 関数へマップする Python のタプルを追加します。
私たちの `hello` View を呼び出すためには以下のようにします:

.. sourcecode:: python

    from django.conf.urls.defaults import *
    from mysite.views import hello

    urlpatterns = patterns('',
        ('^hello/$', hello),
    )

(私たちは、コードを簡略化するために、
コメントアウトされているコードを省いています。
もしあなたが、それらの行を残しておきたいのであれば、
残しておいても構いません。)

私たちはここで2箇所を変更しました。

* 最初に、私たちは `mysite/views.py` モジュールから、 
  `hello` View をインポートするために、
  Python のインポート構文で、 `mysite.views` をインポートしました。
  (これは、 `mysite/views.py` があなたの Python パス上にあると仮定しています。
  詳細は下記の *あなたの Python パス* を参照してください。)

* 次に、私たちは `urlpatterns` に、 `('^hello/$', hello)` を追加しました。
  この行は、 *URLpattern* と呼ばれています。
  それは、最初の要素がパターンマッチ用の文字列(正規表現など)で、
  次の要素がそのパターンが利用する View 関数である Python タプルです。
  簡単に言うと、私たちは、 `hello` という URL へのどんなリクエストでも、
  `hello` View 関数を呼び出すように Django に指定しました。

.. admonition:: あなたの Python パス

あなたが Python の `import` 構文を利用する際に Python が見るのは、
あなたの *Python パス* は、あなたのシステムディレクトリーの一覧です。

例えば、あなたの Python パスが、 
`['', '/usr/lib/python2.4/site-packages', '/home/username/djcode']` 
だったとします。
もしあなたが、 `from foo import bar` という Python 構文を発行した場合は、
Python は、カレントディレクトリー(この構文を発行したディレクトリー)内の `foo.py` を探します。
(Python パスの最初の要素である空文字 `''` は、"カレントディレクトリー"を意味しています。)
もしそのファイルが見つからない場合、
Pythonは、 `/usr/lib/python2.4/site-packages/foo.py` を探します。
そのファイルが見つからない場合は、 `/home/username/djcode/foo.py` を探します。
最後に、そのファイルを見つけられなかった場合は、 
`ImportError` を発生させます。

もし、あなたが自身の Python パスを見てみたいのであれば、
Python のインタラクティブシェルを起動し、以下を入力してください。

.. sourcecode:: python

    >>> import sys
    >>> print sys.path

通常、あなたは Python パスの設定について心配する必要はありません - 
Python や Django は、その内部で自動的にそれを解決しています。
(Python パスの設定は、 `manage.py` スクリプトの仕事の一つです。)