djangobook-cn / djangobook / resources / 2.0 / chapter01.txt

.. _capter01:


Chapter 1: Djangoの紹介
==========================================

この本はWeb開発を楽しく、また時間を短縮するWeb開発フレームワークである Django について解説しています。
Django を使うと、質の高いWebアプリケーションを開発したり、メンテナンスするためのストレスから解放されます。

Web開発の長所は、おもしろくて創造的なことです。
逆に短所は、やっかいな同じ作業の繰り返しでイライラするところです。
Django を使うことにより、そのイライラする作業を軽減し、 - あなたのWebアプリケーションの
本来の目的である - おもしろい作業に集中することができます。
これを実現するためには、一般的な形態のWeb開発パターンを高いレベルで抽象化し、
頻繁にプログラミングしなければならないタスクをショートカットし、
問題を解決するための手法を明確化します。
同時に Django はあなたのやり方に合わせるために、
必要であればフレームワークのスコープ外でも作業ができます。

この本の目標は、あなたに Django の専門家になってもらうことです。
この本が焦点としているものが2つあります。
1点目について、
私たちは Django は何をするのか、
どうやってWebアプリケーションを構築するのかを重点的に解説します。
2点目について、
私たちは、
「このツールを自身のプロジェクトでどう有効活用できるか」
という質問への答えとなる、
適切なコンセプトを高いレベルでディスカッションします。

あなたはこの本を読むことにより、
読みやすくメンテナンスしやすいコードで、
パワフルなWebサイトを短期間で開発するために必要な技術を学べるでしょう。

Webフレームワークとは
--------------------------

Django は比較的新しい世代のWebフレームワークですが、
この用語は正確に何を意味しているのでしょうか?

この質問に答えるために、
フレームワークを使わず、
Python のみで書かれた
Webアプリケーションの設計について考えてみましょう。
わたしたちはこの本を通して、
この近道があなたにとって非常に役立つということを認識してほしいので、
あなたが近道をせずに作業した場合の基本的なアプローチを示します。
(この近道が常に利用できるとは限らないので、
近道せずに物事を成し遂げることにも価値があります)
さらに最も重要なこととして、
Webアプリケーションがどのように動作しているのかを知ることで、
あなたはより良いWeb開発者になれます。

PythonでWebアプリケーションを作る最も簡単な方法のひとつは、
1998年代に最もポピュラーだった技術である 
Common Gateway Interface (CGI) 標準を利用することです。
それがどのように動くかについての概要: 
HTMLを出力する Python スクリプトを書き、
拡張子を ".cgi"としてWebサーバに保存し、
Webブラウザーからそのページを参照する。
たったこれだけです。

例として、ここに最近発行された本10冊をデータベースから取得し、
表示するための Python CGI スクリプトがあります。
構文の詳細についてはあまり気にせず、
このスクリプトの基本的な動作を感じ取ってください。

.. sourcecode:: python

    #!/usr/bin/env python

    import MySQLdb

    print "Content-Type: text/html"
    print # 空白行を出力

    print "<html>"
    print "<head><title>Books</title></head>"
    print "<body>"

    connection = MySQLdb.connect(user='me', passwd='letmein', db='my_db')
    connection.cursor()
    cursor.execute("SELECT name FROM books ORDER BY pub_date DESC LIMIT 10")

    print "<ul>"

    for row in cursor.fetchall():
	print “<li>%s</li>” % row[0]	

    print "</ul>"

    print "</body>"
    print "</html>"

    connection.close()

まず最初に、このコードはCGIとしての用件を満たすために、
"Content-Type"行を出力し、そのあとで空白行を出力しています。
HTMLの開始部分の行(<html>タグなど)を出力し、データーベースへ接続し、
最近発行された10冊分の本の名前を検索するためのクエリーを発行します。
取得した本で繰り返し処理を行い、
そのタイトルをHTMLのリストとして生成しています。
最後に、HTMLの終了部分の行(</html>タグなど)を出力し、
データーベース接続を閉じます。

この例のように、
ある目的に特化したページを一から作るというアプローチは、
必ずしも悪いこととは言えません。
第一に、このコードは理解するのが非常に簡単です。
開発初心者の方でも、
この Python コードを読みむことができ、
その開始から終了までの処理すべてを理解できます。
ここからは他に何も学ぶ必要はありませんし、他のコードを読む必要もありません。
デプロイするのもとても簡単です。
このファイルの拡張子を".cgi"として保存し、
Webサーバにアップロードし、
ブラウザーでそのページを表示するだけです。

こんなに簡単なことですが、
このアプローチには多くの問題点や厄介事があります。
自身にこう問いてみてください。

* あなたのWebアプリケーションの複数箇所から
  データベースへ接続する必要がある時、
  なにが起こりますか?
  間違いなく、各 CGI スクリプトごとにデータベースへ接続するための
  似たようなコードをコピペする必要はありません。
  それは共通機能としてリファクタするのが現実的です。

* 開発者は本当に"Content-Type"行の出力や、
  忘れずにデータベースのコネクションを閉じることなどに気を使うべきでしょうか?
  この種の決まりごとは開発者の生産性を落とし、
  間違えてしまう危険性を高めます。
  この開始と終了に関するタスクは、
  共通のインフラとして取り扱うのが最善です。

* このコードを、データベースやパスワードが異なる
  複数の環境で再利用する場合に何が起こりますか?
  ここでは何らかの環境設定ができる構造が必要です。

* Python コーディング未経験のWebデザイナーが、
  ページのデザインを変更しようとした場合に何が起こりますか?
  1文字誤っただけで、Webアプリケーション全体をダウンさせる可能性もあります。
  理想は、
  ロジック(データベースから本の名前を検索する処理)用のページと
  HTML表示用のページを分け、
  デザイナーがロジックに影響せずにHTMLを編集できることです。

この問題を的確に解決するのがWebフレームワークです。
Webフレームワークは、あなたのアプリケーションに、読みやすく、
メンテナンス性にすぐれた(一から再開発するようなことがない)
コーディングに集中できるようなインフラを提供します。
とても簡単に言うと、それは Django がなせる技です。

MVCデザインパターンとは
--------------------------

前セクションで紹介したアプローチと
Webフレームワークのアプローチの違いが簡単にわかる例を見てみましょう。
ここでは、前セクションのCGIで書かれたコードが、 
Django を使用するとどのように書けるのかを紹介します。
私たちはそれを4つのファイルに分割します:

.. sourcecode:: python

    # models.py (データベーステーブル)

    from django.db import models

    class Book(models.Model):
        name = models.CharField(max_length=50)
        pub_date = models.DateField()


    # views.py (ビジネスロジック)

    from django.shortcuts import render_to_response
    from models import Book

    def latest_books(request):
        book_list = Book.objects.order_by('-pub_date')[:10]
        return render_to_response('latest_books.html', {'book_list': book_list})


    # urls.py (URL構成)

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

    urlpatterns = patterns('',
        (r'^latest/$', views.latest_books),
    )


    # latest_books.html (テンプレート)

    <html>
    <head><title>Books</title></head>
    <body>
    <h1>Books</h1>
    <ul>
    {% for book in book_list %}
    <li>{{ book.name }}</li>
    {% endfor %}
    </ul>
    </body>
    </html>

これも構文の詳細についてはあまり気にせず、
この全体的なデザインを感じ取ってください。
ここで重要なことは、関心事の分離 (SoC: Separation of Concerns) です。

* `models.py` ファイルには、
  Python のクラスとして表された、
  データベースのテーブルに関する記述が含まれています。
  このクラスは *モデル* と呼ばれています。
  モデルを利用することにより、
  あなたはデータベースへのレコードの挿入、取得、更新、削除処理を
  簡単な Python コードを使用することができるようになり、
  SQLステートメントを何度も書く必要がなくなります。

* `views.py` ファイルには、
  ページ単位のビジネスロジックが含まれています。
  `latest_books()` ファンクションは *ビュー* と呼ばれています。

* `urls.py` ファイルには、どのビューが、
  どのURLパターンで呼び出されるかを指定します。
  このケースでは、URL `/latest/` により、
  `latest_books()` ファンクションを呼び出します。
  例えば、あなたのドメインが、 `example.com` だった場合は、
  URL `http://example.com/latest/` により、
  `latest_books()` ファンクションを呼び出します。

* `latest_book.html` ファイルは、
  ページのデザインを記述するための HTML テンプレートファイルです。
  テンプレートには基本的なロジックを記述するためのテンプレート言語が用意されています。
  例えば、 `{% for book in book_list %}` です。

まとめると、この各部品は(厳密ではないですが) 
Model-View-Controller (MVC) と呼ばれています。
簡単に言うと、 MVC はソフトウェアの開発手法であり、
データへのアクセスや定義を記述するためのコード(モデル)と、
リクエストルーティング処理(コントローラ)を分割し、
さらにユーザーインターフェース(ビュー)も分割します。

このアプローチの主な利点は、
コンポーネント間の *依存から解放* されることです。
Django で作られたWebアプリケーションの各部品の主目的は、
他の部品に影響しないよう独立して編集できることです。
例えば開発者は、基本的な実装に影響を与えずに
アプリケーションの特定部分のURLを変更することができます。
デザイナーは各ページのHTMLを編集でき、
Python コードでレンダリングする必要がありません。
データベース管理者がテーブル名や詳細を一箇所で編集でき、
多数のファイルの中から探し出して置き換える必要がありません。

この本では、MVCの各部品を章立てし、詳しく解説します。
Chapter 3 ではビューを、
Chapter 4 ではテンプレートを、
Chapter 5 ではモデルを対象とします。
また、Chapter 5 では Django の MVC 哲学について
徹底的にディスカッションします。

Django の歴史
--------------------------

コードを見る前に、
私たちは Django の歴史について解説する時間を割きたいと思います。
Webフレームワークの解説の時、
*近道せずに* 物事を成し遂げることにも価値があると言いましたが、
それはあなたに「これが近道」ということを十分に理解してほしいからです。
同様に、歴史に関する知識には Django が *なぜ* そのように動作するのかも含まれるので、
Django が作られた理由を理解することは役に立ちます。

もしあなたがWebアプリケーションを開発した経験があれば、
私たちがWebフレームワークの解説で提示した CGI での問題点について詳しいでしょう。
伝統的なWeb開発者は、このような道筋をたどってきました:

#. Webアプリケーションを一から書きます。

#. 別のWebアプリケーションを一から書きます。

#. ステップ1で作ったアプリケーション内に、
   ステップ2で作ったアプリケーションと共通する部分が沢山あることに気づきます。

#. ステップ1で作ったアプリケーションと、
   ステップ2で作ったアプリケーションのコードを
   共通化するようリファクタリングします。

#. 何度かステップ1~4を繰り返します。

#. するとあなたはフレームワークを発明したことに気づきます。

これが、Django 本体が作られた流れです。

Django は、アメリカのカンザス州ローレンスが拠点の
Web開発チームが書いたものが元となり、
全世界的なアプリケーションとして成長しました。
それは、2003年の秋ごろ、
*Lawrence Journal-World* 新聞社で働くWebプログラマーだった、
Adrian Holovaty と Simon Willison が
Python を使用したアプリケーションを開発を始めた時に誕生しました。

*World Online* チーム(Lawrence Journal-WorldのWeb部門)は、
絶えず記事の締切りに終われる開発環境で、
複数の地域ニュースサイトの作成とメンテナンスを担当しています。
各サイト(LJWorld.com、Lawrence.com および KUsports.com を含む)の記者(それと管理者)から、
非常に短期間で機能の追加やアプリケーション全体の構築を要求されました。
それが、ほんの何日間や何時間だったことに注目してください。
したがって、Simon と Adrian は必要に迫られて、
時間を節約できるWeb開発用のフレームワークを開発しました。
それは、彼らが非常に短期間な締切でもアプリケーションを構築、
メンテナンスできる唯一の選択肢でした。

2005年の夏ごろ、このフレームワークの開発が完了し、
World Online サイトの大部分が効率よく運用できるようになった段階で、
チームに新たに Jacob Kaplan-Moss が参加し、
このフレームワークをオープンソースソフトウェアとしてリリースすることにしました。
彼らは、2005年7月にこのフレームワークをリリースし、
JAZZギタリストの Django Reinhardt にちなんで Django と命名しました。

現在、数年を経て、Django は何万人ものユーザをかかえる
安定したオープンソースプロジェクトとなり、
その貢献者は全世界(惑星)に広がっています。

この歴史は、鍵となる2つのことを解説する助けとなります。
一つ目は、Django の"スイート・スポット"です。
Django はニュースサイトとしての環境で生まれたので、
コンテンツサイト(例えば、Amazon.com、craigslist.org、
washingtonpost.com等動的で、データベース・
ドリブンで情報を提供するサイト)に必要な機能
(Chapter 6 で解説するadminインターフェース等)を提供しており、
同様のサイトを開発する場合は非常に有効です。
しかし、心配しないでください。
それらのサイトを開発するには特に有効ですが、
Django は、あらゆる種類の動的なWebサイトの構築にも有です
(ある事に *非常に効果がある* ことと、
他の事には *効果がない* ことはまったく違います)。

二つ目は、Django が始まってから、
そのオープンソースコミュニティ文化を形作った方法です。
なぜなら、Django は学校の課題や商用の製品ではなく、
実社会から生み出されたコードであり、
それは、Django の開発者自身が取り組んでいた(また、取り組み続けた)
Web開発に対する問題点の解決に焦点がおかれています。
その結果、Django 自体は基本的にほぼ毎日のペースで活発に改善されています。
フレームワークのメンテナンスをしている人は、
Django が開発者の時間を節約し、
メンテナンス性に優れたアプリケーションを生成し、
高負荷でも軽快に動作することに関心があります。
もしそのためだけなら、
開発者は自身の時間を削ってでも仕事を楽しみたいという、
彼ら自身の自己実現が動機となっています。
(率直に言うと、彼らは自分のドッグフードを食べています)

この本の読み方
--------------------------
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.