Django入門

Djangoチュートリアル(前編) (1/6):CodeZine
を参考にDjango入門してみる。SEMSに会員登録(無料)しないと全部見れない。


Django ドキュメント — Django v1.0 documentationが本家(訳版)

Everything you need to know about Django (and then some).

困ったときはここ。

Djangoについて

Django - Wikipedia

に重点を置いており、複雑であったり、データベース主体のWebアプリケーションの構築を簡単にするために作成された。

The Web framework for pefectionists with deadlines

ということである。
2012/9時点での最新版は1.4。

MTV

DjangoではMVC(Model View Controller)のControllerをView、ViewをTemplateと呼んでいます。
Model Template ViewでMTV。
Djangoでは

  • どう見せるか→Template
  • どのデータを見せるか→View

という意味で使っています。

Model

Djangoで用意されているO/Rマッパーを担当します。
データベースへのインターフェース。

Template

デザインとコンテンツ、Pythonコードの分離エンジン。

View

HTTPリクエストを引数にとり、HTTPレスポンスを返す。
どのデータを提示するかを決定するロジックを担当。

Controller

⇔URLディスパッチ機構
URLのパスとそれに割り当てられ呼び出されるViewのメソッドのマッピングを記述する。
正規表現が活用されているので、フレームワークの仕様に縛られないURL設計が可能。

Djangoにできる他のこと

キャッシュシステム

memcachedなどのキャッシュシステムと容易に連携が取れる。

国際化

多言語対応。

管理インターフェース

CRUD(Create Read Update Delete)画面が提供されている。
管理用バックエンド画面のテンプレートがすでにあるということ。

Djangoのインストール

Download | Django
上記リンクからせっかくなので最新版をダウンロードし、ローカルの適当なところに配置。

tar xzvf Django-1.4.1.tar.gz
cd Django-1.4.1
sudo python setup.py install

確認は以下のように行う。

Python 2.6.8 (unknown, Jun  9 2012, 11:30:32)
[GCC 4.5.3] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> django.VERSION
(1, 4, 1, 'final', 0)

自分の環境はCygwin

何を作るのか

参考しているサイトにただただしたがって行くと、ECサイト(electronic commerce site)を作るようなので。
ECサイト - Wikipedia

Project作成

プロジェクトを作成するフォルダ(自分は~/works)で

django-admin.py startproject ecsite

とすると必要なファイルが生成される。

manage.py 管理コマンド用ユーティリティー
ecsite/__init__.py 空ファイル、Pythonパッケージ通知用
ecsite/setting.py 基本的なこと(DB接続定義、言語/タイムゾーン定義)の設定ファイル
ecsite/urls.py URL設計。正規表現使える。
ecsite/wsgi.py サーバとアプリケーション間のインターフェース

wsgi

Web Server Gateway Interface(通称:ウイスキー)
Pythonに多数のフレームワークがあるがゆえに生じた、サーバ選択の差異を埋めるために導入されたサーバ⇔アプリケーションのインターフェース。
これによりサーバ可搬性のあるアプリケーションの開発が可能になった。
Django、GAEなどで使われている。
PEP 333 -- Python Web Server Gateway Interface v1.0にて正式に発表。
日本語での詳細はWSGIことはじめ | スマートフォン要点だけブログ
話がDjangoからそれてしまうので理解&勉強する際は下記のリンクから。
WSGIとPythonでスマートなWebアプリケーション開発を|gihyo.jp … 技術評論社

サーバの起動

manage.py runserver

とすると、zsh: command not found: manage.py

python manage.py runserver

にすると、

Validating models...

0 errors found
Django version 1.4.1, using settings 'ecsite.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

起動成功。
ポート番号を変えたい場合は簡単に変えられる。

python manage.py runserver 8080

setting.pyの編集

Django1.4はsetting.pyのDB設定周りが若干異なるので以下を参考にする。
ちなみにDBはSQLite3を使う。
Django 1.4 で新しくプロジェクトを作成した際にしておくsettings.pyの設定 - kk6のメモ帳*
google:Django1.4 チュートリアル

DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.sqlite3', 
         'NAME': os.path.dirname(__file__) + os.sep + 'ecsite.sqlite',          
         'USER': '',                      
         'PASSWORD': '',                  
         'HOST': '',                      
         'PORT': '',                      
    }
}
TIME_ZONE = 'Asia/Tokyo'
LANGUAGE_CODE = 'ja'

DBはENGINEとNAMEを編集する。他はSQLiteの場合何も書かなくていい。
TIME_ZOMEとLANGUAGE_CODEは上記のように編集。

DBの同期

% python manage.py syncdb
Creating tables ...
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
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 : 
E-mail address:
Password:
Password (again):
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

途中Usernameなどは適宜入力。この時の情報は管理画面にログインするときに聞かれるので忘れずに。
これでDBが初期化される。
Cygwinには多分SQLiteは入っていると思うが一応チェック。

% sqlite3
SQLite version 3.7.12.1 2012-05-22 02:45:53
Enter ".help" for instructions
Enter SQL statements terminated with a ";"

manage.pyのあるフォルダで

sqlite3 ecsite.sqlite

or

python manage.py dbshell

でSQLite3を立ち上げることができる。ダンプ(.dump)して確認終了。

Application作成

商品表示用のページを作成する。

python manage.py startapp itempage

itempageフォルダが作成され、
中身には
__init__.py, models.py tests.py views.py
が含まれる。
Djangoに追加を認識させるために、setting.pyのINCLUDE_APPSにecsite.itempageを追加する。

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'ecsite.itempage',
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
)

About Model

モデルはDBの1テーブルに対応し、フィールドは各カラムに対応します。
コードは以下の通り。

# -*- 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_code 商品コード
item_name 商品名
price 価格
start_date 掲載開始日

書くフィールドは書いてあるようにインスタンス生成時に初期化される。
Metaインナークラスは、このモデルに対するテーブル名を指定している。
このインナークラスを書かない場合、テーブル名は"itempage_item"となりアプリケーション名の入ったものになってしまうので、明示的にテーブル名をつけることにする。

DBとの同期

% python manage.py syncdb # 同期
Creating tables ...
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
% python manage.py dbshell
(ry
sqlite>.dump # 確認
(ry

モデルの操作

DBとの同期が終わったら、モデルを操作できるようになります。

% python manage.py shell

とするとインタプリタが出てくるのでデータを作成。

>>> from itempage.models import Item
>>> item = Item()
>>> item.item_name = 'item1'
>>> item.price = 1000
>>> item.save()

データの確認

% python manage.py dbshell
SQLite version 3.7.12.1 2012-05-22 02:45:53
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from item;
1||item1|1000|

ModelをHTMLに表示

URLディスパッチャ、テンプレート、Viewの関係図
http://codezine.jp/static/images/article/4065/fig04.gif

テンプレートの作成

setting.py

setting.py内のTEMPLATE_LOADERSにテンプレートを配置するルートフォルダを追加する。
自分の場合、~/works/ecsite/templates
追加するときはカンマ(,)を忘れずに。

templatesフォルダ

簡単な商品表示画面。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>

{{}}の部分は、Viewメソッドによりテンプレートが動的に変換される部分になっている。
ここでは、商品コード、商品名、値段。

URLディスパッチャの設定(urls.py)

urls.pyを編集する。

urlpatterns = patterns('',
    (r'^item/(?P<item_id>\d+)/$', 'ecsite.itempage.views.item_page_display'),
)

第一引数に正規表現パス、第二引数にViewメソッド。
r'^item/(?P\d+)/$' → item/数字/行末コード
数字の部分の(?P\d+)は、マッチした部分のをitem_idという引数でメソッドに渡すということを表します。

View Method

urls.pyにあったitem_page_displayを定義する。

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))

実行

python manage.py runserver

として確認。