Python Web フレームワーク、第 2 回: TurboGears と Python を使って Web 開発を行う

オンライン・ショッピング・アプリケーションで基本を学ぶ

2 部構成のシリーズのこの第 2 回の記事では、TurboGears について説明します。TurboGears は、Pythonをベースにしたもう 1 つのオープン・ソースで、MVC スタイルの Web アプリケーション・フレームワークです。第1 回の記事では Django フレームワークを紹介しましたが、この記事では、TurboGears を使った Web ベースのショッピング・アプリケーションの作成方法を説明し、最後にTurbogears と Django を比較します。

Ian Maurer (ian@itmaurer.com), Senior Consultant, Brulant, Inc.

Author photo: Ian MaurerIan MaurerはBrulant, Inc.のシニア・コンサルタントであり、コンシューマー商品や小売りなど様々な業界のために、オープンソース技術やIBM WebSphere技術を使った統合eコマース・ソリューションの開発を専門としています。彼はオハイオ州北東部に住み、クリーブランド地区のPython Interest Groupのメンバーでもあります。



2006年 7月 11日

TurboGears の開発者は、このプロジェクトを「メガフレームワーク」と呼びます。それはこのプロジェクトが、前から存在するいくつかのサブプロジェクトで構成されているためです。TurboGearsは、数多くの主要コンポーネントを合わせて使うときに役に立ちます。

  • MochiKit: JavaScript ライブラリー
  • Kid: テンプレート言語
  • CherryPy: 基本の Web フレームワーク
  • SQLObject: ORM (Object-relational mapper: オブジェクト・リレーショナル・マッパー)

TurboGears をインストールする

TurboGears で作業する場合には、まず Python がインストールされていることを確認します。最新バージョンのTurboGears では Python 2.4 が必要です。Python ホーム・ページへのリンクについては、参考文献を参照してください。

setuptools は、Python コミュニティーの新しいプロジェクトで、Python ソフトウェアのインストールと更新を簡単に行えるようにしてくれます。そのソフトウェアは、Java™JAR ファイルあるいは Ruby GEM ファイルに似た、Egg というアーカイブ・ファイルにパッケージされており、easy_installというツールを使ってダウンロードとインストールを行います。

TurboGears は、配布とインストールに setuptools を使用する初めての大規模なPython プロジェクトの 1 つです。setuptools ページと TurboGears ダウンロード・ページへのリンクについては、参考文献を参照してください。

この記事では、執筆時の最新の開発バージョン (0.9a5) を、プレビュー・ダウンロード・ページからダウンロードして使用します。

easy_install -f http://www.turbogears.org/preview/download/index.html TurboGears

最新の安定バージョンの TurboGears (現在は 0.8.9) を入手するには、単に -fオプションとプレビュー・サイトへの URL を削除します。

easy_install TurboGears

TurboGears 管理ツールを確認する

TurboGears をインストールした後、管理ツール tg-admin を使えるようにパスを設定します。コマンドラインでtg-admin とタイプして確認します。

リスト 1. TurboGears 管理ツールを使用する
~/dev$ tg-admin

TurboGears 0.9a5 command line interface

Usage: /usr/bin/tg-admin [command] [options]

Available commands:
i18n  Manage i18n data
info  Show version info
quickstart  Create a new TurboGears project
shell  Start a Python prompt with your database available
sql  Run the SQLObject manager
toolbox  Launch the TurboGears Toolbox
update  Update an existing turbogears project

クイック・スタート

TurboGears プロジェクトを開始するには、 tg-admin quickstart 機能を使います。最初にプロジェクト名とディレクトリー名の両方を指定するように求められます。この記事では、TG Commerce という簡単なショッピング・カートの例を作成します。パッケージ名はtgcommerce です。

リスト 2. TurboGears プロジェクトを開始する
~/dev$ tg-admin quickstart
Enter project name: TG Commerce
Enter package name [tgcommerce]:
Selected and implied templates:
turbogears#turbogears  web framework

Variables:
package:  tgcommerce
project:  TG-Commerce
Creating template turbogears
Creating ./TG-Commerce/

... (output snipped) ...

TurboGears は、tgcommerce パッケージが入った TG-Commerce プロジェクト・ディレクトリーを作成します。これで、プロジェクトがインストールされたテスト・サーバーを始動することができます。

リスト 3. テスト・サーバーを始動する
~/dev/TG-Commerce$ python start-tgcommerce.py

... (output snipped) ...

05/Mar/2006:11:31:54 HTTP INFO Serving HTTP on http://localhost:8080/

示されている URL でテスト・ページを表示してから、Ctrl-C でサーバーを強制終了します。


モデルを作成する

SQLObject は ORM ライブラリーで、ORM ライブラリーを使うと、データベース・パーシスタントPython オブジェクトを開発することができます。まず、Python クラスを定義して必要な属性(フィールド) を追加します。次に、テーブルの作成、新規レコードの挿入、および既存のレコードの検索、更新、または削除を行うために必要なSQL を SQLObject で生成します。

SQLObject は、MySQL、PostgreSQL、Firebird などのいくつかのデータベースをサポートします。SQLObjectの詳細については、参考文献のリンクを参照してください。

この例では、データベース・バックエンドとして SQLite を使用します。SQLiteは、構成を必要とせず、手軽なファイルとしてディスクに置いておける軽量データベースです。SQLiteを使用するには、setuptools を使って pysqlite ライブラリーをインストールします。

easy_install pysqlite

TurboGears データベースを構成するには、dev.cfg ファイルで sqlobject.dburiを指定します。SQLite の場合は、データベース・ファイルを入れるパスを指定します。

リスト 4. 開発構成ファイル (dev.cfg)
sqlobject.dburi="notrans_sqlite:///path/to/devdir/TG-Commerce/tgcommerce.database"
server.environment="development"
autoreload.package="tgcommerce"

TurboGears の quickstart は model.py ファイルを作成して、ボイラープレート・コードを事前に取り込みます。SQLObjectクラスはここに配置します。上部には、データベース接続ハブをセットアップするセクションがあります。

リスト 5. モデルのボイラープレート・コード (model.py)
from sqlobject import *
from turbogears.database import PackageHub

hub = PackageHub("tgcommerce")
__connection__ = hub

次はモデル・クラスです。それぞれのクラスがデータベースの表を表し、データベースの列にマップされるクラス・レベルの属性とともに定義されています。これらの属性は、StringColや CurrencyCol などの基本データ型、および ForeignKey や MultipleJoin などの関係型を含むSQLObject 列タイプのインスタンスです。

このショッピング・カートには、階層化された Category クラスと単純な Productクラスがあります。Category の階層は、親 ForeignKey およびサブカテゴリーMultipleJoin によって定義されます。

リスト 6. Category クラスと Product クラス (model.py、続く)
class Category(SQLObject):
name = StringCol(length=64)
parent = ForeignKey('Category', default=None)
subcategories = MultipleJoin('Category', joinColumn='parent_id')
products = MultipleJoin('Product')

class Product(SQLObject):
name = StringCol(length=64)
sku = StringCol(length=64)
price = CurrencyCol(notNone=True, default=0.0)
category = ForeignKey('Category')

モデルを確認するには、tg-admin sql sql コマンドを使って、必要な表を作成するSQL コードを表示します。SQLObject は各表ごとに id 列を作成していることに注意してください。主キーが定義されていないと、このようになります。SQLObjectに関する他の資料へのリンクについては、参考文献を参照してください。

リスト 7. tg-admin sql sql コマンドを使ってデータベース・スキーマを表示する
~/dev/TG-Commerce$ tg-admin sql sql
Using database URI sqlite:///home/ubuntu/dev/TG-Commerce/tgcommerce.db
CREATE TABLE category (
id INTEGER PRIMARY KEY,
name VARCHAR(64),
parent_id INT
);

CREATE TABLE product (
id INTEGER PRIMARY KEY,
name VARCHAR(64),
sku VARCHAR(64),
price DECIMAL(10, 2) NOT NULL,
category_id INT
);

以下に、ショッピング・カートとその項目を保管するために使われる Order クラスとOrderItem クラスを示します。order は SQL キーワードなので、Order クラスの表名は、sqlmetaサブクラスの表属性を使って orders に再定義されています。

リスト 8. Order クラスと OrderItem クラス (model.py、続く)
class Order(SQLObject):
items = MultipleJoin('OrderItem', joinColumn='order_id')

class sqlmeta:
table = 'orders'

class OrderItem(SQLObject):
quantity = IntCol(notNone=True)
price = CurrencyCol(notNone=True)
total = CurrencyCol(notNone=True)
order = ForeignKey('Order')
product = ForeignKey('Product')

tg-admin sql create コマンドを使って、データベース表を作成します。

リスト 9. 「tg-admin sql create」コマンドを使ってデータベース表を作成する
~/dev$ tg-admin sql create
Using database URI sqlite:///home/ubuntu/dev/TG-Commerce/tgcommerce.db

tg-admin sql help を使って、表を削除するためのコマンドを含め、もっとたくさんのコマンドを見つけることができます。このコマンドを使うと、すべての表とデータを削除してしまうため、細心の注意を払ってお使いください。このため、実稼働環境ではtg-admin コマンドをロックしておく必要があります。


CatWalk でモデルを操作する

バージョン 0.9 から、TurboGears には Toolbox というツール・セットが付属しています。このツール・セットには、CatWalkというモデル・ブラウザーが組み込まれています。CatWalk は、開発者が GUIツールを使ってモデルのデータを素早く作成、更新、および削除できるように設計されています。

Toolbox は別のサーバーとして始動し、tg-admin コマンドを使って実行されます。

リスト 10. tg-admin を使って toolbox サーバーを始動する
~/dev/TG-Commerce$ tg-admin toolbox
... (snip) ...
05/Mar/2006:15:01:33 HTTP INFO Serving HTTP on http://localhost:7654/

ブラウザーが自動的に開かない場合は、Toolbox サーバーが指定する URL (http://localhost:7654/)に移動して、CatWalk リンクをクリックして CatWalk を開いてください。

図 1. CatWalk ツール
The CatWalk tool

toolbox は、エンド・ユーザーではなく開発者を対象としており、データをモデル化する際の補助として、またデータを使ったアプリケーションのブートストラッピングを行う場合に使うのが最適です。toolboxサーバーは、Ctrl-C を使ってシャットダウンできます。しかし、このウォークスルーではシャットダウンはしません。


ビューを作成する

TurboGears でビューを作成するデフォルトの方法は Kid XML テンプレート言語を使って行います。Kidは XML を使うため、すべてのテンプレートが適切に形成されている必要があります。そうでないと、レンダリングの最中に例外がスローされてしまいます。またKid はテンプレートの継承をサポートしますが、そこで得られたテンプレートは、基本テンプレートから拡張できるため、共通のコードを作成でき、1箇所で保守することができます。

TurboGears では、Kid ファイルは .kid 拡張子が付いており、テンプレート・ディレクトリーにあります。デフォルトでは、master.kidファイルと welcome.kid ファイルがあります。master.kid は基本テンプレート・ファイルで、welcome.kidは <html> タグ内で py:extends 属性を使って master.kid から継承します。

新しいテンプレートを作成するには、welcome.kid ファイルをコピーするか名前変更して、これを開始点として使うことをお勧めします。この例では、カテゴリー・テンプレートを最初に作成しました。このテンプレートは、特定のカテゴリーに関する以下の情報を表示します。

  • カテゴリー名 (タイトルおよびブレッドクラム)
  • 祖先へのリンク (ブレッドクラム)
  • サブカテゴリーへのリンク (リスト)
  • プロダクトへのリンク (リスト)
リスト 11. カテゴリー・ページの kid テンプレート・ファイル (category.kid)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:py="http://purl.org/kid/ns#"
py:extends="master.kid">

<head>
<title>Category: ${category.name}</title>
</head>

<body>
<div id="breadcrumbs">
<ul>
        <li py:for="ancestor in list(category.ancestors)[::-1]">
                >
                <a href="/category/${ancestor.id}"
                                py:content="ancestor.name"></a>
        </li>
        <li id="active">
                > <span py:replace="category.name" />
        </li>
</ul>
</div>

<div id="subcategories" py:if="category.subcategories">
<div class="header">Subcategories</div>
<ul>
        <li py:for="subcategory in category.subcategories">
                <a href="/category/${subcategory.id}"
                                py:content="subcategory.name"></a>
        </li>
</ul>
</div>

<div id="subcategories" py:if="category.products">
<div class="header">Products</div>
<ul>
        <li py:for="product in category.products">
                <a href="/product/${product.id}"
                                py:content="product.name"></a>
        </li>
</ul>
</div>
</body>
</html>

リスト 11 は、主要な Kid 機能の一部を示しています。

  • py:extends を使って master.kid から継承する
  • ${category.name} を使ってタイトルで式を置換する
  • py:for を使って祖先、サブカテゴリー、およびプロダクト間でループする
  • スライシングの論理を使ってブレッドクラムで祖先の表示を反転させる
  • py:content を使ってリンクのテキストを入力する
  • py:replace で span タグを完全に置き換える

上記で参照している ancestors 属性を有効にするには、_get_ancestors メソッドを含めるようにCategory モデル・クラスを変更する必要があります。

リスト 12. Category クラスに追加された「ancestors」属性の「get」メソッド
class Category(SQLObject):
name = StringCol(length=64)
parent = ForeignKey('Category', default=None)
subcategories = MultipleJoin('Category', joinColumn='parent_id')
products = MultipleJoin('Product')

def _get_ancestors(self):
ancestor = self.parent
while ancestor:
yield ancestor
ancestor = ancestor.parent

コントローラーを作成する

TurboGears の quickstart は、プロジェクトに Root コントローラー・クラスの場所であるcontrollers.py モジュールを提供します。controllers.py モジュールは、アプリケーションの主なエントリー・ポイントであり、新しいコントローラー・メソッドを追加する場所です。

以下に、TurboGears expose デコレーターによってカテゴリー HTML テンプレートに関連付けられた2 つのコントローラー・メソッドの例を示します。コントローラー・メソッドは、指定されたKid テンプレートのレンダリング中に名前空間として使われる辞書またはコンテキストを返します。

リスト 13. コントローラー・クラス
from turbogears import controllers, expose

class Root(controllers.Root):

@expose("tgcommerce.templates.category")
def index(self):
from model import Category
category = Category.selectBy(parent=None)[0]
return dict(category=category)

@expose("tgcommerce.templates.category")
def category(self, categoryID):
from model import Category
category = Category.get(categoryID)
return dict(category=category)

TurboGears では、URL はメソッドに完全にマップされ、Root コントローラー内に含まれています。ルートURL / は、index と呼ばれる特殊なメソッドにマップされます。category というメソッドをRoot に追加することで、URL /category からアクセスすることができます。送信したURL が指定されたメソッドに一致しない場合は、default メソッドが定義されていない限り、404エラーが発生します。

以下に、考えられる URL シナリオとその結果を示します。

  • /: は、親 id なしの最初のカテゴリーを表示する。
  • /category?categoryID=2: は、id が 2 のカテゴリーを表示する。
  • /category/1: は、id が 1 のカテゴリーを表示する (TG 0.9 で使用可能なフォーマット)
  • /category: は、カテゴリー id がないため、500 エラーをスローする。
  • /xyz: は、404 エラーをスローする。

図 2 は、カテゴリー表示ページを示しています。

図 2. カテゴリー表示
The category display

プロダクト表示

プロダクト表示ページでは、product コントローラーが作成されます。このコントローラーは、データベースからプロダクトを取得して、レンダリングのためにproduct Kid テンプレートに渡します。

リスト 14. 追加された Product コントローラー・メソッド
@expose("tgcommerce.templates.product")
def product(self, productID):
from model import Product
product = Product.get(productID)
return dict(product=product)

product.kid テンプレートには、プロダクト情報の表があります。Python ストリング・フォーマットを使うと、有効数字2 桁の価格が表示されることに、注意してください。

リスト 15. カテゴリー・ページの kid テンプレート・ファイル (product.kid)
<table id="product-info">
<tr>
<td class="fld">Name:</td>
<td class="val"><span py:replace="product.name" /></td>
</tr>
<tr>
<td class="fld">SKU:</td>
<td class="val"><span py:replace="product.sku" /></td>
</tr>
<tr>
<td class="fld">Price:</td>
<td class="val">$<span py:replace="'%.2f' % product.price" /></td>
</tr>
</table>

図 3 は、プロダクト表示ページを示しています。

図 3. プロダクト表示ページ
The product display page

エラー・ハンドリング

コントローラー・メソッドは、SQLObject get メソッドがスローする SQLObjectNotFoundを考慮に入れていません。リスト 16 は、この例外をキャッチして、NotFound例外として再スローするリファクタリングを示しています。NotFound 例外は、基本的なHTTP 404 エラーを送信します。

リスト 16. コントローラー・クラスに追加されたエラー・ハンドリング
from model import Category, Product
from sqlobject import SQLObjectNotFound
from cherrypy import NotFound
from turbogears import controllers, expose, url

class Root(controllers.Root):

@expose("tgcommerce.templates.category")
def category(self, categoryID):
try:
category = Category.get(categoryID)
except SQLObjectNotFound:
raise NotFound()
return dict(category=category)

@expose("tgcommerce.templates.product")
def product(self, productID):
try:
product = Product.get(productID)
except SQLObjectNotFound:
raise NotFound()
return dict(product=product)

不足オブジェクトをハンドリングするための別の方法は、404 エラーを送信するのではなく、代わりにリダイレクトする方法です。これは、turbogears.redirect(...)メソッドを使って行います。

リスト 17. リダイレクトの例
from turbogears import redirect
try:
object = ClassName.get(objectID)
except SQLObjectNotFound:
raise redirect("/path_to_redirect")

ショッピング・カート

ショッピング・カートを機能させるには、要求の間で状態を維持するためにセッションを有効にする必要があります。セッションを有効にするには、構成ファイルでsession_filter.on 値を True に設定します。

リスト 18. 構成ファイルで有効にされたセッション (dev.cfg)
session_filter.on = True
sqlobject.dburi="notrans_sqlite:///path/to/devdir/TG-Commerce/tgcommerce.database"
server.environment="development"
autoreload.package="tgcommerce"

各ページに現在のショッピング・カートを表示するには、その HTML をコピーして各ページに貼り付けるのではなく、masterテンプレート・ファイルに入れます。

リスト 19. master kid テンプレートに含まれているショッピング・カート (master.kid)
<html>
<body>
...
<div id="shopping-cart">
Shopping Cart:
<span id="cart-qty" py:content="cart.total_quantity" /> items
($<span id="cart-amt" py:content="'%.2f' % cart.total_price" />)
</div>
</body>
</html>

上記テンプレートの変更は、コントローラー・メソッドから返される辞書に cart値がないため、失敗します。リスト 20 では、セッションに現在保管されているカートを含むようにproducts メソッドを変更しています。

リスト 20. コントローラーから返されたショッピング・カート・オブジェクト
@expose("tgcommerce.templates.product")
def product(self, productID):
try:
product = Product.get(productID)
except SQLObjectNotFound:
raise NotFound()
return self.results(product=product)

def results(self, cart=None, **kw):
if not cart:
cart = self.get_cart()
kw['cart'] = cart
return kw

def get_cart(self):
cartID = session.get("cartID", None)

cart = None
if cartID:
try:
cart = Order.get(cartID)
except SQLObjectNotFound:
pass

if cart is None:
cart = Order()
session["cartID"] = cart.id

return cart

results メソッドは、get_cart を呼び出して、現在の Order オブジェクトを取得するか、またはOrder オブジェクトが存在しないもしくは見つからない場合には、新規に作成します。indexメソッドと category メソッドにも、この変更を行う必要があります。


Ajax の add to cart

このショッピング・カート例を決まり文句に従わせるには、ページを更新表示せず、Ajaxを呼び出してプロダクトの add-to-cart 機能を実行します。初心者のために説明すると、Ajaxは Web の実装パターンで、Asynchronous JavaScript + XML の略語です。最初にAjax 用語を定義した記事が参考文献にリストされています。

この例では、トランスポート・フォーマットとして XML ではなく JSON (JavaScriptObject Notation) を使います。JSON はより軽量で、TurboGears と MochiKitの両方で元々サポートされています。Asynchronous JavaScript and JSON を使う人が増えていますが、単に頭字語Ajaj はひびきがあまりよくないため、Ajax moniker が引き続き使われるでしょう。

訳注: 上記箇所段落にて、原文では「asynchronous JavaScript with JSON」となっていますが、「AsynchronousJavascript and JSON」の誤りと思われます。直後の Ajaj の話とも矛盾してしまうので、「AsynchronousJavascript and JSON」と翻訳しました。

以下に示すのは、指定されたプロダクトを取得して、現在セッションにあるカートに追加するコントローラー・メソッドのadd_to_cart です。このメソッドは、カート・オブジェクト、およびカート内の項目の総額と数量を返します。

リスト 21. add_to_cart コントローラー・メソッド
@expose()
def add_to_cart(self, productID):
cart = self.get_cart()

product = Product.get(productID)
cart.add_product(product, 1)

return self.results(cart=cart,
price=cart.total_price,
quantity=cart.total_quantity)

テンプレート名で expose メソッドが指定されていないことに注目してください。これは、メソッドがブラウザーから直接呼び出されず、HTMLでレンダリングされないためです。add_to_cart ページ (http://localhost:8080/add_to_cart/1)をブラウザーで直接表示するか、または curl のようなツールを使って表示する場合は、未加工のJSON データ {"tg_flash":null, "price":24, "cart":{"id":24},"quantity":1} を使います。

クライアント (ブラウザー) の JavaScript からサーバーの add_to_cart コントローラー・メソッドを呼び出すのは非常に単純です。MochiKitは、loadJSONDoc という関数を提供します。これは URL を取得して、据え置きオブジェクトとして知られているオブジェクトを返します。非同期呼び出しが応答を返す際に、コールバック・メソッドの定義にこの据え置きオブジェクトを使うことができます。

リスト 22. ショッピング・カートの AJAX ロジック (cart.js)
function addToCart(productID) {
var deferred = loadJSONDoc('/add_to_cart/' + productID);
deferred.addCallback(updateCart);
}

function updateCart(results) {
$("cart-amt").innerHTML = numberFormatter("#.00")(results["price"]);
$("cart-qty").innerHTML = results["quantity"];
}

戻り時に updateCart 関数が呼び出され、results という連想配列変数で JSON値が与えられます。この関数は、ID 属性と innerHTML 属性を使って、カートの総額と数量を更新します。さらに、価格の有効数字を指定するために、便利なMochiKit numberFormatter 関数が使われます。

最後のステップは、上の addToCart 関数を呼び出すリンクを追加して、現在のプロダクトID を渡すことです。また、MochiKit.js ファイルと cart.js ファイルをスクリプト・タグとしてプロダクト・テンプレートに追加する必要があります。

リスト 23. プロダクトページに追加された add to cart の JavaScript の呼び出し(product.kid)
<head>
...
<script src="/tg_js/MochiKit.js" type="text/javascript" />
<script src="/static/javascript/cart.js" type="text/javascript" />
</head>
<body>
...
<table>
...
<tr>
        <td colspan="2" align="right">
                <a href="#" onclick="addToCart(${product.id})">Add To Cart</a>
        </td>
</tr>
</table>
</body>

まとめ: TurboGears と Django を比較する

Django と TurboGears は、両方とも MVC スタイルのフレームワークで、Python言語を使って Web サイトをアジャイルかつ迅速に開発することができます。ニーズに最も合う方を選択するには、以下の相違点を考慮してください。

  • 背景:

    両方のプロジェクトが、Ruby on Rails のように既存のアプリケーションから抽出されて、オープン・ソース・コミュニティーにリリースされました。Djangoの方が歴史は長く、もともとは 1 日に何百万ものページが表示されるオンライン新聞から生まれました。TurboGearsは、まだ開発中のリッチクライアントである RSS News Reader アプリケーションからもたらされました。TurboGearsは、前から存在するオープン・ソース・コンポーネントを使って構築されたため、Djangoよりもコミュニティー主導型です。

    それぞれのプロジェクトの背景の違いは、プロジェクトの優先順位の違いにつながりました。オンライン・ジャーナリズムという、需要が高くてペースが早い世界から来ているDjango チームは、コンテンツ・ベースのアプリケーションを迅速に構成して、簡単に変更できるフレームワークに焦点を合わせました。TurboGearsチームは、消費者プロダクトの基盤を使って、リッチクライアント・アプリケーションとプラグ可能なアーキテクチャーを目指しました。

  • URL:

    TurboGears の要求ディスパッチ・メカニズムは、コントローラー・クラスおよびメソッド名を介して行われます。新しいコントローラー・クラスまたはメソッドを追加すると、自動的に使用可能になります。コントローラーの実行パスを変更する必要がある場合は、コードの構造を再構成しなければなりません。反対に、Djangoは、別の正規表現ベースの構成ファイルを使用して URL を基礎となるコードにマップして、URLパス構造を実際の実装から切り離します。

    TurboGears システムは、expose デコレーターさえあれば新規ページを使用可能にできるため、TurboGearsシステムのセットアップは、Django より高速に行えます。しかし、Django の構成システムは、最高レベルの制御と柔軟性を備えています。DjangoURL は、主要なリファクタリング後でも、アプリケーションで簡単に再マップできます。これは、古いブックマークやキャッシュされた検索エンジンの結果によって引き起こされる「リンク切れ」を防ぐことができます。「リンク切れ」は、Djangoが作成するように意図されているコンテンツ・ベースの Web サイトのトラフィック・レベルと使いやすさを大きく損ねます。

  • コードの再利用:

    TurboGears チームは、TG が既存のコンポーネントから構成されているプロジェクトであることを明確に示すために、このプロジェクトをメガフレームワークと呼んでいます。TurboGearsチームは、コードをゼロから作成するのではなく、使用可能な最高のオープン・ソース・コードを選択して組み合わせます。TurboGearsフレームワークの副次的な利点は、これがメガコミュニティーを持つメガプロジェクトであるという点です。TGは強力で中心となる力を持つようになり、TurboGears を構成するコア・コンポーネントへの興味をかきたて、その使用を後押ししています。TGは、さまざまなオープン・ソースに光をあててくれているのです。

    他方で Django は、既存の Python コンポーネントの状態が今日ほどは安定していなかった2003 年に作成されました。Django Web スタックはゼロから作成され、最終的には安定したフレームワークになり、1日に何百万ものヒットを処理する複数の Web サイトを作成するために使用されました。しかし、一部の間では、コードの再利用が足りないため、Djangoプロジェクトは NIH (自社開発主義) 症候群に苦しんでいる可能性があると主張されています。Djangoチームは、Python でゼロからフレームワークを作成する作業は、既存のコンポーネントをつなぎ合わせるより難しいということはなく、最終的にはより均一で結束したフレームワークになるという見解を示しています。

  • JavaScript:

    TurboGears は、MochiKit という JavaScript ライブラリーをフレームワーク内での最高の位置付けにしています。またチームは、「リッチな」フォーム・エレメントを作成するためにJavaScript を大いに活用するウィジェット・ライブラリーも作成しました。これは、TurboGearsの世界でリッチクライアント (Ajax) の開発がどれほど重要かを示しています。Djangoチームでは、デフォルトで JavaScript ライブラリーをフレームワークと一緒に組み込むよう選択しませんでしたが、その可能性については議論をしました。どちらのプロジェクトも、JavaScriptライブラリーの使用をいかなる形で制限することもありません。

  • 管理ツール:

    両方のプロジェクトに管理インターフェースがあります。Django の管理ツールの対象者は、洗練されたデータ入力ツールを必要とするエンド・ユーザーです。そのため、アプリケーションに新機能を追加するたびにカスタム・ツールが必要になるわけではありません。他方で、TurboGearsの管理ツールは開発者に焦点を合わせており、設計ツール・セットと基本的なデータベース・ビューアーとエディターを備えています。

  • ライセンス:

    Django はゼロから作成されたため、プロジェクト全体が 1 つのオープン・ソース・ライセンス(BSD ライセンス) の下に属しています。複数のプロジェクトで構成される TurboGearsにはいくつかのライセンスがあり、ORM ツールである SQLObject は、LGPL (LesserGeneral Public License) によって保護されています。LGPL には、SQLObjectライブラリー自体のソース・コードを変更および配布する場合は、これらの変更を使用可能にする必要があると記載されています。このライセンスには、オープン・ソースにするために使用するアプリケーションは必要ありません。それにもかかわらず、一部の企業では、LGPLでライセンスを取得したソフトウェアの使用を禁止しています。そのような場合は、SQLAlchemyの使用を検討することをお勧めします。SQLAlchemy は、TG コミュニティーで強力にサポートされている別のORM ツールです。

  • 実例:

    Django および TurboGears の機能を使って作成された有名なサイトがリストされているページへのリンクについては、参考文献セクションを参照してください。これらの実際のアプリケーションは、それぞれのツールで実行できることを実証します。

参考文献

学ぶために

製品や技術を入手するために

  • Python.org は、Python プログラミング言語の本拠地です。ここには、Python インタープリターおよび標準ライブラリーをダウンロードするためのリンクがあります。
  • TurboGears.com は、TurboGears フレームワークのホーム・ページです。
  • TurboGears プレビュー・サイトは、0.9 アルファ・リリースの現在の本拠地です。
  • Kid は、TurboGears 用の XML ベースのテンプレート言語です。
  • CherryPy は、TurboGears フレームワークの基本を提供する、Python のオブジェクト指向Web フレームワークです。
  • MochiKit は、DOM および Ajax をサポートする、十分にテストされた JavaScript ライブラリーです。
  • JSON (JavaScript Object Notation) は、非同期メッセージングで MochiKit および TurboGears によって使用される軽量のデータ交換フォーマットです。
  • Linux での次の開発プロジェクトの構築に、developerWorks から直接ダウンロードできるIBM trial software をご利用ください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source, Web development
ArticleID=232097
ArticleTitle=Python Web フレームワーク、第 2 回: TurboGears と Python を使って Web 開発を行う
publish-date=07112006