2015年1月23日金曜日

Djangoによるアプリケーション開発の基本的な手順

 図4に本稿で紹介する開発手順を示しました。以降では、この手順に従って説明を進めていきます。
4Djangoウェブアプリケーション構築の手順
 
 それでは前準備として、PythonDjangoをインストールしてみましょう。
Pythonのインストール
 Python の公式サイトのダウンロードページから、該当プラットフォームのバイナリをダウンロードします。バージョンは、Djangoがサポートしている2.6.2(執筆現在)をダウンロード(Python 2.6.2 Windows installer)します。ダウンロードした「Python-2.6.2.msi」をダブルクリックすると、インストーラが開始しますので、以降はインストーラに従いインストールを進めます。インストールフォルダは「C:¥Python26」としました。インストール完了後、環境変数のPATHに以下を追加設定してください。
[リスト1 環境変数PATHの設定
C:\Python26;C:\Python26\Tools\Scripts
Djangoのインストール
 次にDjangoをインストールします。Djangoの公式サイトのダウンロードページからパッケージングされたファイルをダウンロードします。ダウンロードしたファイルを任意のフォルダに展開します(著者は「C:\temp」以下に展開しました)。DOSプロンプトで、展開したフォルダの直下に移動し、以下のコマンドを実行します。
[リスト2 Djangoのインストール
python setup.py install
 以下の場所に、Djangoのフォルダとファイルがコピーされます。
  • C:¥Python26¥Lib¥site-packages
  • C:¥Python26¥Scripts¥django-admin.py
 LinuxMacOSの場合もインストール方法もほぼ変わりません。Django本家サイトのインストールガイドDjango和訳ドキュメントのインストールガイドなどを参照してください。
Djangoのインストール確認
 DOSプロンプトで、Pythonを実行し、Pythonの対話型インターフェイスから次のように入力して確認します。
[リスト3 Djangoのインストール確認
> python
Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import django
>>> django.VERSION
(1, 1, 0, 'beta', 1)
 Djangoのバージョンが正しく表示されれば、インストールが正常に完了しています。
プロジェクトの作成
 次にDjangoのプロジェクトを作成します。任意のフォルダ(著者は「C:¥codezine」フォルダ)で、以下のコマンドを実行します。今回はECサイトを構築するので「ecsite」というプロジェクト名とします。
[リスト4 Djangoプロジェクトの作成
> django-admin.py startproject ecsite
 コマンド実行が完了すると「ecsite」というフォルダが作成され(「C:¥codezine¥ecsite」)フォルダ内には、以下の表に示した4つのファイルが作成されます。
初めに生成される4つのファイル
ファイル名 説明
__init__.py このディレクトリが Python パッケージであることを Python に知らせるための空のファイル
manage.py Django プロジェクトに対するさまざまな操作を行うための管理コマンド用ユーティリティ
settings.py Django プロジェクトの設定ファイル。DB接続定義や言語/タイムゾーンなど基本的な設定を記述する
urls.py Django プロジェクトの URL設計を定義する。正規表現を用いてURLとビューのマッピングを定義する。
開発サーバの起動・動作確認
 プロジェクトの作成を確認してみましょう。Djangoに同梱されている開発用スタンドアロンWebサーバを起動します。DOSプロンプトでプロジェクトのフォルダから(著者の場合「C:¥codezine¥ecsite」)以下のコマンドを実行します。
[リスト5 開発用サーバの起動
> manage.py runserver
 ブラウザを立ち上げ「http://127.0.0.1:8000/」にアクセスしてください。以下の画面が表示されれば、プロジェクトの作成は成功しています。
5:プロジェクト作成時トップ画面の確認
setting.pyの編集(SQLite接続設定)
 次に、データベースの接続、言語、タイムゾーンの設定をします。プロジェクトフォルダ直下にあるsettings.py(著者環境の場合「C:¥codezine¥ecsite¥settings.py」)を次のように編集します。
[リスト6 settings.py
DATABASE_ENGINE = 'sqlite3'    # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
import os
DATABASE_NAME = os.path.dirname(__file__) + os.sep + 'ecsite.sqlite'
DATABASE_USER = ''             # Not used with sqlite3.
DATABASE_PASSWORD = ''         # Not used with sqlite3.
DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.
 
TIME_ZONE = 'Asia/Tokyo'
LANGUAGE_CODE = 'ja'
 SQLite3を使用する場合、DATABASE_ENGINEに「sqlite3」、DATABASE_NAMEには、データベースファイル名を指定します。上記では、Pythonコードによって、動的にファイルパスを生成しています(著者環境の場合「C:¥codezine¥ecsite¥ecsite.sqlite」という名前でデータベースファイルが作成されます)。SQLite3を使用する場合、DATABASE_USERDATABASE_PASSWORDDATABASE_HOSTDATABASE_PORTの指定は必要ありません。タイムゾーン、言語はデフォルト指定では、それぞれ「America/Chicago」「en-us」になっていますが、それぞれ「Asia/Tokyo」「ja」に書き換えます。
プロジェクト管理情報のDBへの同期
 settings.pyを編集して使用するDBの設定などが完了したところで、DBを初期化します。プロジェクトフォルダの直下で以下のコマンドを実行します。
[リスト7 DjangoプロジェクトのDB初期化
> manage.py syncdb
 実行すると、DB上にDjangoの管理用テーブルが作成されます。実行中のプロンプトでDjangoのスーパーユーザーを作るか否かを聞いてくるので「yes」と打ち込んでください。その後、管理者ユーザーIDとメールアドレス、パスワードも聞いてきますので入力します。このユーザーは、後に管理インターフェイスでログインする際に使用するユーザーなので忘れないようにしておいてください。
[リスト8 DB初期化時のプロンプト表示
Creating table auth_permission
Creating table auth_group
Creating table auth_user
Creating table auth_message
Creating table django_content_type
Creating table django_session
Creating table django_site
 
You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username: admin
E-mail address: user@example.com
Password:
Password (again):
Superuser created successfully.
Installing index for auth.Permission model
Installing index for auth.Message model
DBの確認(syncdb実行結果の確認)
 データベースを初期化したところで、作成したDBの中身を確認しましょう。SQLiteDBを参照するには、SQLite3の実行ファイルを取得する必要があります。SQLiteのサイトのダウンロードページで「sqlite-3.6.14.tar.gz」(執筆時の最新)を取得し、ファイルを解凍して「sqlite3.exe」を環境変数PATHが通っているフォルダにコピーしてください。その後プロジェクトフォルダに移動し、次のように実行します。
[リスト9 SQLite3の実行
> sqlite3 ecsite.sqlite
 上記のecsite.sqliteの個所には、DBファイル名を指定します。本稿ではsettings.pyDATABASE_NAMEパラメータに指定したファイル名です。
 SQLite3 のプロンプトが立ち上がったら、以下のコマンドを打ち込んでください。Create Database文や作成したテーブルのCreateテーブル文を参照することができます。SQLiteのプロンプトではSQLを実行したり、テーブルを作成したり、データベースを直接操作することができます。
[リスト10 SQLite3のダンプ
> .dump
 Djangoでは「manage.py dbshell」とオプションを指定することでsettings.pyに設定したDBを直接操作できるのですが、Django1.1Betaの場合、Windowsではうまく動作しないのでSQLite3の実行ファイルを直接起動してデータベースファイルにアクセスするか、SQLite3用アクセス用のツールなどを使用する必要があります。筆者は、環境変数PATHで指定されたフォルダにSQLite3の実行ファイルを配置し「manage.py dbshell」を実行したのですが、以下のエラーが出力され、操作できませんでしたので本稿では直接sqlite3のコマンドを実行します(2009713日現在のレポジトリのメイントランクから取得した最新ソースの場合、正常にdbshellが実行できました。1.1の正式版ではバグは修正されるようです)。
[リスト11 manage.pyからのDB接続
> manage.py dbshell
Error: You appear not to have the 'sqlite3' program installed or on your path.
アプリケーションの開発
 プロジェクトを作成したら、次にアプリケーションを作成します。
アプリケーション作成コマンド実行
 アプリケーションを作成するには、プロジェクトフォルダ(著者の場合「C:¥codezine¥ecsite」)で、以下のコマンドを実行します。ここでは商品ページを表示するためのアプリケーションなので、名前を「itempage」とします。
[リスト12 アプリケーションの作成
> manage.py startapp itempage
 コマンドの実行が完了すると、プロジェクトフォルダの直下に「itempage」というフォルダが作成され、以下の表に示した4つのファイルが作成されます。
アプリケーションを作成すると生成される4つのファイル
ファイル名 説明
__init__.py このディレクトリが Python パッケージであることを Python に知らせるための空のファイル
models.py モデル定義をするためのファイル
tests.py UnitTestを記述するためのファイル
views.py ビュー関数を定義するためのファイル
アプリケーションの追加設定
 アプリケーションを作成したら、Djangoに認識させるためにプロジェクトフォルダの「settings.py」を編集し、INSTALLED_APPSパラメータにアプリケーション名である「ecsite.itempage」を追加します。アプリケーション名は「プロジェクトサイト名.アプリケーション名」となります。名前はPythonのパッケージ名と一致します。
[リスト13 settings.py
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'ecsite.itempage',
)
モデルの作成
 アプリケーションを作成したら、いよいよモデルを作成します。モデルは基本的にデータベースの1テーブルと対応し、フィールドはDBテーブルの1カラムにマッピングします。
モデルのコーディング
 ここでは商品のクラスをコーディングします。アプリケーションフォルダにある「models.py」を次のように編集します。ファイルはUTF-8形式で保存してください。
[リスト14 models.pyの編集(Itemクラスのコーディング)
# -*- coding: utf-8 -*-
from django.db import models
 
# Create your models here.
class Item(models.Model):
    item_code = models.CharField(u'商品コード',max_length=256,unique=True)
    item_name = models.CharField(u'商品名',max_length=256)
    price = models.PositiveIntegerField(u'価格')
    start_date = models.DateField(u'掲載開始日',null=True);
 
    def __unicode__(self):
        return self.item_code
 
    class Meta:
        db_table = 'item'
 モデルクラスは、django.db.models.Modelクラスを継承して作成します。ここでは、Itemクラスは、商品コード(item_code)、商品名(item_name)、価格(price)、掲載開始日(start_date)を属性として持つこととします。
 各フィールドは型を表現するクラスによって定義され、そのコンストラクタにさまざまな制約を定義することができます。例えばitem_codeフィールドは文字列型なので、CharFieldクラスによって定義され、コンストラクタに最大文字バイト数が256バイト(max_length=256)、テーブル内でユニーク(unique=True)という制約を定義しています。
 __unicode__メソッドはインスタンスの文字列表現を返します。ここでは、商品コード(item_code)を返します。モデルに対応するテーブル名は、インナークラスMetadb_tableフィールドに名前を指定します。このフィールドを定義しなくても、「アプリケーション名_モデル名」というのがデフォルトのテーブル名(本稿の場合「itempage_item」)になりますが、アプリケーション名が入らないテーブル名の方が一般的と思われますので、ここではテーブル名を明示的に指定します。
モデルとDBの同期
 次に作成したモデルをDBに反映します。プロジェクトフォルダにて以下のコマンドを実行します。
[リスト15 モデルとDBの同期
> manage.py syncdb
 「Creating table item」と画面に表示されたら成功です。SQLite3 で早速テーブルを確認してみましょう。
[リスト16 SQLite3への同期確認
> sqlite3 ecsite.sqlite
SQLite version 3.6.13
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .dump
 
(……省略……)
CREATE TABLE "item" (
    "id" integer NOT NULL PRIMARY KEY,
    "item_code" varchar(256) NOT NULL UNIQUE,
    "item_name" varchar(256) NOT NULL,
    "price" integer unsigned NOT NULL,
    "start_date" date
);
(……省略……)
コマンドラインからモデルを操作する
 モデルを作成し、DBと同期すると、Djangoのユーティリティを通じてPythonのシェルからモデルを操作できるようになります。プロジェクトフォルダにて以下のコマンドを実行します。
[リスト17 コマンドラインからのモデル操作
> manage.py shell
 起動したシェル上で次のように打ち込みます。
[リスト18 コマンドラインからのitemモデル操作
>>> from itempage.models import Item
>>> item = Item()
>>> item.item_name='item1'
>>> item.price = 1000
>>> item.save()
 SQLite3DBを直接確認してみましょう。
[リスト19 SQLite3上のデータ作成確認
> sqlite3 ecsite.sqlite
sqlite> select * from item;
1|item-00001|item1|1000|
 1件のレコードが作成されているのが確認できました。
モデルをHTMLに表示する
 データを作成したところで、DBからデータを取得しHTMLに表示する処理を作成します。
URLディスパッチャ、テンプレート、ビュー関数の関連
 モデルを作成したところで、作成したモデルをHTMLに表示する機能を実装します。URLディスパッチャ、ビュー関数、テンプレートシステムの関係を図6に示しました。
6URLディスパッチャ・ビュー関数・テンプレートシステムの関係
 図中に記載されている設定ファイルの記述、ソースコードについては順に説明していきます。
テンプレートの作成
 まずは、モデルを表示するためのテンプレートを作成します。
settings.pyの編集
 テンプレートファイルはDjangoのディレクトリ構造と切り離して設定することができます。「settings.py」ファイルのTEMPLATE_DIRSパラメータに、テンプレートを配置するルートフォルダを指定します。この値はカンマ区切りで複数指定することができます。ここでは「C:/codezine/django/templates」をテンプレート用のルートフォルダとして設定します。
[リスト20 settings.py TEMPLATE_DIRSパラメータの編集
TEMPLATE_DIRS = (
    'C:/codezine/django/templates',
)
テンプレートファイルの作成
 次に、テンプレートファイルを作成します。ファイルはsettings.pyTEMPLATE_DIRSパラメータに指定した「C:/codezine/django/templates」の下にさらにpageフォルダを作成し「item.html」というファイル名(フルパス「C:/codezine/django/templates/page/item.html」)で作成します。ファイルの中身は次のとおりです。商品コード(item_code)、商品名(item_name)、価格(price)を表示するだけの簡単なページです。
[リスト21 item.html
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   <title>{{ item.item_name }}</title>
<head>
<body>
<center>
商品コード:{{ item.item_code }}<br>
商品名:{{ item.item_name }}<br>
価格:{{ item.price }}<br>
<br>
<input type="submit" value="買い物かごに入れる">
</center>
</body>
</html>
 テンプレートファイル内の「{{ item.item_name }}」と二重の中カッコになっている箇所に注目してください。ここはテンプレートがビュー関数で動的に変換される場所になります。ここでは商品コード、商品名、価格が表示時に動的に変換されます。
URLディスパッチャの定義
 URLによるビュー関数のディスパッチを定義するには、プロジェクトフォルダ「c:¥codezine¥ecsite」の「urls.py」を編集します。
[リスト22 urls.pyの編集
urlpatterns = patterns('',
    (r'^item/(?P<item_id>\d+)/$', 'ecsite.itempage.views.item_page_display'),
)
 urlpatterns変数内のpatterns関数の第1引数に正規表現でパスを定義し、第2引数に対応するビュー関数の名前を指定します。「r'^item/(?P<item_id>\d+)/$'」は、「item/数字/行末コード」を表します。数字の部分の「(?P<item_id>\d+)」は、マッチした部分をitem_idという名前の引数でビュー関数に渡すことを意味します。第2引数の「'ecsite.itempage.views.item_page_display'」は「ecsite.itempage.views」パッケージのビュー関数「item_page_display」を呼ぶことを意味します。ビュー関数「item_page_display」の実際のコードは以降で説明します。
ビュー関数の定義
 最後にビュー関数をコーディングします。アプリケーションフォルダのviews.pyitem_page_display関数を定義します。item_page_display関数の引数は、HTTPリクエストを表すHttpRequestオブジェクトと、URLで指定されたitem_id2つです。item_id引数は、URLディスパッチャの定義で説明したようにURLで指定されたitem_idが渡されます。ビュー関数では、引数item_idに該当するItemオブジェクトをO/RマッパーのAPIを取得し、テンプレートとマージして、レスポンスを表すHttpResponseオブジェクトを返します。HttpResponseのコンストラクタには、画面に表示するHTMLの文字列を設定します。
[リスト23 views.py
from django.http import HttpResponse
from django.template import Context, loader
from models import Item
 
def item_page_display(request,item_id):
    # item_idに該当するオブジェクトを取得する
    item = Item.objects.get(id=item_id)
    # テンプレートを取得して、モデルの値とマージする
    t = loader.get_template('page/item.html')
    c = Context(
        {'item':item }
    )
    # HTTP Responseを返す。
    return HttpResponse(t.render(c))
 item_page_display関数内で使われている処理の簡単な説明を以下の表に示します。
キャプション
処理 説明
Item.objects.get(id=item_id) Modelクラスのobjects属性は、オブジェクトマネージャと呼ばれ、DBから指定した条件に合ったオブジェクトや集合を取得するメソッドをもっています。getメソッドは、引数に指定された検索条件に合致する単一のオブジェクトを取得します。
loader.get_template('page/item.html') loaderクラスのget_templateメソッドは引数で指定されたテンプレートファイルを表したインスタンスを返します。テンプレートファイルのパスは、settings.pyファイルの「TEMPLATE_DIRS」に設定したフォルダからの相対パスを指定します。
Context({'item':item }) Contextクラスには、テンプレートに渡すデータを辞書形式で指定します。ここでは「item」という名前でItemクラスのインスタンスを設定しています。
t.render(c) Templateクラスのrenderメソッドは引数にContextクラスのインスタンスを受取り、テンプレート文字列とContextの情報をマージして文字列として返します。
商品ページの表示
 商品画面表示のためのそれぞれの設定、ファイル作成がひととおり終わったところでブラウザから「http://localhost:8000/item/1/」にアクセスしてみましょう。図7のような画面が表示されれば成功です。
7:商品画面の表示
まとめ
 Django の最初のステップ(モデル作成、HTML画面の表示)について駆け足で説明してきましたが、いかがでしたでしょうか。Djangoは、簡単に簡潔できれいなアプリケーションを書くための仕組みが数多く用意されていて、快適にアプリケーションを開発することができます。前編のチュートリアルだけでも、ひととおり動くWebアプリケーションが10分もあれば開発できることがご理解いただけたかのではないかと思います。後編では、モデルAPIや、その他Djangoが用意している便利な機能を使用して、アプリケーションを拡張していきます。
 
 

0 件のコメント:

コメントを投稿