Source

djangobook-cn / djangobook / resources / 2.0 / _build / pickle / _sources / chapter01.txt

Full commit
.. _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 %}` です。