TurboGears 开发人员称这个项目是一个 “大框架(megaframework)”,这是因为它是由现有的子项目构成的。TurboGears 可以帮助将很多主要组件集成在一起:
- MochiKit:JavaScript 库
- Kid:模板语言
- CherryPy:基本 Web 框架
- SQLObject:对象关系映射器(ORM)
使用 TurboGears 的第一个步骤是确保我们已经安装了 Python。TurboGears 的最新版本需要 Python 2.4。请参见 参考资料 中 Python 主页的链接。
Setuptools 是 Python 社区开发的一个新项目,它可以更方便地安装并更新 Python 软件。软件以归档文件的形式进行打包,称为 Egg,这与 Java™ 的 JAR 文件或 Ruby GEM 文件类似,可以使用一个名为 easy_install 的工具下载并安装。
TurboGears 是第一个使用 setuptools 工具来进行分发和安装的大型 Python 项目。请参见 参考资料 中 setuptools 页面的链接和 TurboGears 的下载页面。
本文使用了撰写本文时最新的开发版本(0.9a5),这可以通过 preview 的下载页面得到:
easy_install -f http://www.turbogears.org/preview/download/index.html TurboGears
要获得最新版本的 TurboGears(目前是 0.8.9),我们可以简单地删除 -f 选项和 preview 站点的 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)库,它让我们可以开发数据库持久的 Python 对象。我们定义一个 Python 类,并添加所需要的属性(域),然后让 SQLObject 生成创建表、插入新记录以及查找、更新或删除现有记录时所需用到的 SQL 语句。
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 快速启动使用样例代码创建并提前生成了一个 model.py 文件。这就是 SQLObject 类应该保存的地方。最上面一节设置数据库连接信息:
清单 5. 模型样例代码(model.py)- from sqlobject import *
- from turbogears.database import PackageHub
- hub = PackageHub("tgcommerce")
- __connection__ = hub
接下来是模型类。每个类表示数据库中的一个表,它是使用一个映射为数据库列的类级属性定义的。这些属性是 SQLObject 列类型的实例,包括基本数据类型,例如 StringCol 和 CurrencyCol;以及关系类型,例如 ForeignKey 和 MultipleJoin。
对于这个购物车来说,有一个层次 Category 类和一个简单的 Product 类。目录层次是由父 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 工具Toolbox 是面向开发人员的,而不是面向终端用户的,它最适合辅助完成数据模型化和为应用程序快速提供数据。我们可以使用 Ctrl-C 关闭 toolbox 服务器。在本文介绍中,我们将不会使用这个工具。
(来自 IBM developerworks)