Django入門
Djangoチュートリアル(前編) (1/6):CodeZine
を参考にDjango入門してみる。SEMSに会員登録(無料)しないと全部見れない。
Django ドキュメント — Django v1.0 documentationが本家(訳版)
Everything you need to know about Django (and then some).
困ったときはここ。
Djangoについて
に重点を置いており、複雑であったり、データベース主体のWebアプリケーションの構築を簡単にするために作成された。
The Web framework for pefectionists with deadlines
ということである。
2012/9時点での最新版は1.4。
Djangoのアーキテクチャ全体像
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レスポンスを返す。
どのデータを提示するかを決定するロジックを担当。
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|
テンプレートの作成
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
数字の部分の(?P
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))