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

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
.. _2.0-chapter01:

第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の各部品を章立てし、詳しく解説します。
第3章ではビューを、
第4章ではテンプレートを、
第5章ではモデルを対象とします。
また、第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等動的で、データベース・
ドリブンで情報を提供するサイト)に必要な機能
(第6章で解説するadminインターフェース等)を提供しており、
同様のサイトを開発する場合は非常に有効です。
しかし、心配しないでください。
それらのサイトを開発するには特に有効ですが、
Django は、あらゆる種類の動的なWebサイトの構築にも有です
(ある事に *非常に効果がある* ことと、
他の事には *効果がない* ことはまったく違います)。

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

この本の読み方
--------------

この本の執筆にあたり、
読みやすさを優先してはいますが、
私たちは読みやすさと参照性のバランスを保つよう試みました。
先述したように、この本の目標は、あなたに Django の専門家になってもらうことであり、
私たちはそれを達成する最高の方法が、
Django の機能を淡々と徹底的に解説するよりも、
練習問題と多くの例を提供することであると信じています。
(英語のことわざにもあるように、誰かに話し方を教える時、
ただ単にアルファベットだけを教えようとは思いません。)

私たちは、あなたがそれを心に留め、第1章から7章 までは順を追って読むことをお勧めします。
それは、Django を利用するための基礎となります。
あなたはそれを一度読めば、Django で動くWebサイトを作ることができるようになります。
残りの章は、Django の特定の機能にフォーカスを当てているので、
どんな順序読んでもかまいません。

付録は参考資料です。
それは、無料のドキュメントである `http://www.djangoproject.com/
<http://www.djangoproject.com/>`_ と一緒に、
時折構文を思い出すために戻ったり、
Django の特定部分の動作概要を迅速に見つけたりできます。

求められるプログラミング知識
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

この本の読者は、手続き型でオブジェクト指向プログラミングの基本を理解している必要があります:
制御構造(例えば、 `if` 、 `while` 、 `for` 等)、
データ構造(配列、ハッシュ/辞書)、
変数、クラスとオブジェクト等。

あなたが予想のとおり、Web開発の経験は非常に助けになりますが、
それはこの本を理解するために必須ではありません。
この本を通し、私たちはあまりこの経験がない読者のために、
Web開発においてのベストプラクティスをプロモートします。

求められる Python の知識
~~~~~~~~~~~~~~~~~~~~~~~~

Django のコアは、
Python プラグミング言語で書かれたライブラリーの集合です。
Django を利用したサイトを開発するには、
あなたはこのライブラリーを利用する Python コードを書きます。
Django を学ぶということは、
Python でプログラミングすること方法を学び、
Django のライブラリーがどのよう機能するかについて学ぶことです。

もし、あなたに Python プログラミングの開発経験があれば、
あなたは何の支障もなく入り込めるでしょう。
一般的に、Django コードは多くのマジックがあるわけではありません
(例えば、プログラミングのトリックを適用するのは説明や理解が難しい)。
あなたにとって、Django を学ぶということは、
Django の構成要素とAPIを学ぶことです。

もし、あなたに Python プログラミングの開発経験がないのであれば、
素晴らしい出会いとなるでしょう。
それは簡単に学び、楽しく使えます。
この本は、Python のチュートリアルとしては充実していませんが、
コードが直感的に理解できない場合は、
必要に応じ Python の機能と機能性を強調します。
しかし、私たちはあなたが `http://docs.python.org/tut/
<http://docs.python.org/tut/>`_ でオンラインで利用できる、
公式の Python チュートリアルを読むことをお勧めします。
私たちも `http://www.diveintopython.org/
<http://www.diveintopython.org/>`_ でオンラインで利用できる、
Mark Pilgrim が執筆している *Dive Into Python* という無料の本を読むことをお勧めします。

求められる Django のバージョン
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

この本は、Django の 1.* リリースシリーズに対応しています。
例えば、バージョン 1.0、1.0.2 または 1.1 です。
Django の開発者は、"major version" 番号の範囲内での下位互換を保証しています。
この保証は、あなたが Django 1.0 で書いたアプリが、
1.1、1.2、1.9 また番号が "1" で始まるどのバージョン上でも動作することを意味しています。

いつか Django が 2.0 に達したとき、
あなたのアプリケーションは書きなおす必要があるかもしれません -
しかし、バージョン 2.0 までの道のりは非常に長いでしょう。
判断基準として、バージョン 1.0 のリリースに3年以上かかりました。
(これは、Python 言語の下位互換保障と類似しています:
Python 2.0 で書かれたコードは Python 2.6 で動作しますが、
Python 3.0 で動作するとは限りません。)

この本は 1.0 に対応しているので、しばらくの間あなたに貢献します。

助けを得る
~~~~~~~~~~

Django の最も大きな利点の1つが、親切で役立つユーザコミュニティです。
Django のどんな側面 - インストールから、アプリケーション設計、
データベース設計、デプロイまで - の助けでも、
オンラインで遠慮せずに質問することができます。

* django-users メーリングリストは、何千もの Django ユーザが、
  質問したり、質問に答えるために頻繁に利用しています。 `http://www.djangoproject.com/r/django-users
  <http://www.djangoproject.com/r/django-users>`_ で無料で登録できます。

* Django IRC チャンネルは、Django ユーザが、
  チャットでリアルタイムにお互いを助け合うために頻繁に利用しています。
  Freenode IRC ネットワークの #django に参加して下さい。

    日本にも様々なユーザコミュニティがあり、多くの有志による助けが得られますよ。
    
    * `Django 日本サイト
      <http://djangoproject.jp/>`_

    * `Django 日本語メーリングリスト
      <http://groups.google.com/group/django-ja/>`_

    * `Django 日本語チャット
      <http://www.lingr.com/room/django-ja>`_

次章について
------------

:ref:`次の章 <2.0-chapter02>` では、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.