楼主: 我的素质低
886 1

[Python] 〖探索python〗使用 TurboGears 和 Python 开发 Web 站点(二) [推广有奖]

学术权威

83%

还不是VIP/贵宾

-

TA的文库  其他...

〖素质文库〗

结构方程模型

考研资料库

威望
8
论坛币
23388 个
通用积分
28302.4104
学术水平
2705 点
热心指数
2881 点
信用等级
2398 点
经验
223743 点
帖子
2977
精华
52
在线时间
2175 小时
注册时间
2012-11-24
最后登录
2024-1-13

一级伯乐勋章 初级学术勋章 初级热心勋章 初级信用勋章 中级热心勋章 中级学术勋章 中级信用勋章 高级学术勋章 高级热心勋章 高级信用勋章 特级学术勋章

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

TurboGears 开发人员称这个项目是一个 “大框架(megaframework)”,这是因为它是由现有的子项目构成的。TurboGears 可以帮助将很多主要组件集成在一起:



  • MochiKit:JavaScript 库
  • Kid:模板语言
  • CherryPy:基本 Web 框架
  • SQLObject:对象关系映射器(ORM)


安装 TurboGears




使用 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 管理工具
  1. ~/dev$ tg-admin

  2. TurboGears 0.9a5 command line interface

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

  4. Available commands:
  5.       i18n  Manage i18n data
  6.       info  Show version info
  7. quickstart  Create a new TurboGears project
  8.      shell  Start a Python prompt with your database available
  9.        sql  Run the SQLObject manager
  10.    toolbox  Launch the TurboGears Toolbox
  11.     update  Update an existing turbogears project
复制代码





快速启动



要启动 TurboGears 项目,我们需要使用 tg-admin quickstart 功能。我们会被要求提供一个项目名和一个目录名。对于本文来说,我创建了一个简单的购物车,名为 TG Commerce,它有一个名为 tgcommerce 的包:

清单 2. 启动 TurboGears 项目
  1. ~/dev$ tg-admin quickstart
  2. Enter project name: TG Commerce
  3. Enter package name [tgcommerce]:
  4. Selected and implied templates:
  5.   turbogears#turbogears  web framework

  6. Variables:
  7.   package:  tgcommerce
  8.   project:  TG-Commerce
  9. Creating template turbogears
  10.   Creating ./TG-Commerce/

  11.     ... (output snipped) ...
复制代码


TurboGears 使用下面的 tgcommerce 包创建一个 TG-Commerce 项目。我们现在可以启动这个项目提供的测试服务器了:


清单 3. 启动测试服务器
  1. ~/dev/TG-Commerce$ python start-tgcommerce.py

  2. ... (output snipped) ...

  3. 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)
  1. sqlobject.dburi="notrans_sqlite:///path/to/devdir/TG-Commerce/tgcommerce.database"
  2. server.environment="development"
  3. autoreload.package="tgcommerce"
复制代码


TurboGears 快速启动使用样例代码创建并提前生成了一个 model.py 文件。这就是 SQLObject 类应该保存的地方。最上面一节设置数据库连接信息:

清单 5. 模型样例代码(model.py)
  1. from sqlobject import *
  2. from turbogears.database import PackageHub

  3. hub = PackageHub("tgcommerce")
  4. __connection__ = hub
复制代码


接下来是模型类。每个类表示数据库中的一个表,它是使用一个映射为数据库列的类级属性定义的。这些属性是 SQLObject 列类型的实例,包括基本数据类型,例如 StringCol 和 CurrencyCol;以及关系类型,例如 ForeignKey 和 MultipleJoin。

对于这个购物车来说,有一个层次 Category 类和一个简单的 Product 类。目录层次是由父 ForeignKey 和子类 MultipleJoin 定义的。


清单 6. Category 和 Product 类(model.py,续)
  1. class Category(SQLObject):
  2.     name = StringCol(length=64)
  3.     parent = ForeignKey('Category', default=None)
  4.     subcategories = MultipleJoin('Category', joinColumn='parent_id')
  5.     products = MultipleJoin('Product')

  6. class Product(SQLObject):
  7.     name = StringCol(length=64)
  8.     sku = StringCol(length=64)
  9.     price = CurrencyCol(notNone=True, default=0.0)
  10.     category = ForeignKey('Category')
复制代码


要验证这个模型,请使用 tg-admin sql sql 命令显示创建所需要的表使用的 SQL 代码。注意 SQLObject 会为每个表都创建一个 id 列。即使没有定义主键,这种操作也会发生。有关 SQLObject 的更多文档,请参见 参考资料 给出的链接。


清单 7. 使用 “tg-admin sql sql” 命令查看数据库模式
  1. ~/dev/TG-Commerce$ tg-admin sql sql
  2. Using database URI sqlite:///home/ubuntu/dev/TG-Commerce/tgcommerce.db
  3. CREATE TABLE category (
  4.     id INTEGER PRIMARY KEY,
  5.     name VARCHAR(64),
  6.     parent_id INT
  7. );

  8. CREATE TABLE product (
  9.     id INTEGER PRIMARY KEY,
  10.     name VARCHAR(64),
  11.     sku VARCHAR(64),
  12.     price DECIMAL(10, 2) NOT NULL,
  13.     category_id INT
  14. );
复制代码


下面是 Order 和 OrderItem 类,它们分别用来保存购物车和所购物品清单。由于 order 是一个 SQL 关键字,因此 Order 类的表名被使用sqlmeta 子类的表属性重新定义为 orders:


清单 8. Order 和 OrderItem 类(model.py,续)
  1. class Order(SQLObject):
  2.     items = MultipleJoin('OrderItem', joinColumn='order_id')

  3.     class sqlmeta:
  4.         table = 'orders'

  5. class OrderItem(SQLObject):
  6.     quantity = IntCol(notNone=True)
  7.     price = CurrencyCol(notNone=True)
  8.     total = CurrencyCol(notNone=True)
  9.     order = ForeignKey('Order')
  10.     product = ForeignKey('Product')
复制代码


使用 tg-admin sql create 命令创建数据库表:


清单 9. 使用 “tg-admin sql create” 命令创建数据库表
  1. ~/dev$ tg-admin sql create
  2. 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 服务器
  1. ~/dev/TG-Commerce$ tg-admin toolbox
  2. ... (snip) ...
  3. 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)






二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python Gear WEB ARS ear python 开发

已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
niuniuyiwan + 60 + 60 + 5 + 5 + 5 精彩帖子

总评分: 经验 + 60  论坛币 + 60  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

本帖被以下文库推荐

心晴的时候,雨也是晴;心雨的时候,晴也是雨!
扣扣:407117636,欢迎一块儿吐槽!!
沙发
我的素质低 学生认证  发表于 2015-4-6 14:39:54 |只看作者 |坛友微信交流群
创建视图

在 TurboGears 中创建视图的默认方法是使用 Kid XML 模板化语言。由于 Kid 使用了 XML,因此所有的模板都必须很好地进行格式化,否则在呈现时就会抛出异常。Kid 还可以支持模板继承(template inheritance),这样所生成的新模板就可以对基本模板进行扩充,从而可以在一个地方创建并维护通用代码。

在 TurboGears 中,Kid 文件都位于 templates 目录中,扩展名为 .kid。默认情况下,有一个 master.kid 文件和一个 welcome.kid 文件,其中 master.kid 文件是基础模板文件,welcome.kid 在其 <html> 标记中使用 py:extends 属性对其进行了继承。

要创建一个新模板,我建议您对 welcome.kid 文件进行拷贝或重命名,并使用它作为起点开始下一步的工作。对于本例来说,我们首先创建的是分类模板,它会显示有关给定分类的以下信息:


  • 分类名(title 和 breadcrumb)
  • 到祖先的链接(breadcrumb)
  • 到子分类的链接(list)
  • 到产品的链接(list)

清单 11. 分类页面 kid 模板文件(category.kid
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml"
  4.     xmlns:py="http://purl.org/kid/ns#"
  5.     py:extends="'master.kid'">

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

  9. <body>
  10.         <div id="breadcrumbs">
  11.                 <ul>
  12.                         <li py:for="ancestor in list(category.ancestors)[::-1]">
  13.                                 >
  14.                                 <a href="/category/${ancestor.id}"
  15.                                                 py:content="ancestor.name"></a>
  16.                         </li>
  17.                         <li id="active">
  18.                                 > <span py:replace="category.name" />
  19.                         </li>
  20.                 </ul>
  21.         </div>

  22.         <div id="subcategories" py:if="category.subcategories">
  23.                 <div class="header">Subcategories</div>
  24.                 <ul>
  25.                         <li py:for="subcategory in category.subcategories">
  26.                                 <a href="/category/${subcategory.id}"
  27.                                                 py:content="subcategory.name"></a>
  28.                         </li>
  29.                 </ul>
  30.         </div>

  31.         <div id="subcategories" py:if="category.products">
  32.                 <div class="header">Products</div>
  33.                 <ul>
  34.                         <li py:for="product in category.products">
  35.                                 <a href="/product/${product.id}"
  36.                                                 py:content="product.name"></a>
  37.                         </li>
  38.                 </ul>
  39.         </div>
  40. </body>
  41. </html>
复制代码

清单 11 展示了一些关键的 Kid 功能:


  • 使用 py:extends 继承 master.kid
  • 在 title 中使用 ${category.name} 进行表达式替换
  • 使用 py:for 遍历祖先、子分类和产品
  • 使用限制逻辑对在 breadcrumb 中显示的祖先进行反向
  • 使用 py:content 填充链接文本
  • 使用 py:replace 完全替换 span 标记

上面引用的 ancestors 属性要想有效,Category 模型类需要修改成包含一个 _get_ancestors 方法:

清单 12. 将 “ancestors” 属性的 “get” 方法添加到 Category 类中
  1. class Category(SQLObject):
  2.     name = StringCol(length=64)
  3.     parent = ForeignKey('Category', default=None)
  4.     subcategories = MultipleJoin('Category', joinColumn='parent_id')
  5.     products = MultipleJoin('Product')

  6.     def _get_ancestors(self):
  7. ancestor = self.parent
  8. while ancestor:
  9.     yield ancestor
  10.     ancestor = ancestor.parent
复制代码



创建控制器

TurboGears quickstart 提供了一个具有 controllers.py 模块的项目,该模块是 Root 控制器类所在的位置。这是应用程序的主入口点,也是添加新控制器方法的地方。

下面是 TurboGears expose 中与分类 HTML 模板有关的两个样例控制器方法。控制器方法会返回字典,它们在对指定的 Kid 模板进行呈现时被用作名称空间或上下文。

清单 13. 控制器类
  1. from turbogears import controllers, expose

  2. class Root(controllers.Root):

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

  8.     @expose("tgcommerce.templates.category")
  9.     def category(self, categoryID):
  10.         from model import Category
  11.         category = Category.get(categoryID)
  12.         return dict(category=category)
复制代码


在 TurboGears 中,URL 非常清楚地映射到方法上,它们都包含在 Root 控制器中。根 URL / 映射为一个名为 index 的特殊方法。通过向 Root添加一个名为 category 的方法,它就可以通过 URL /category 进行访问了。任何提交的 URL 如果无法匹配给定方法,就会产生一个 404 错误,除非定义了一个 default 方法。

下面是一些可能的 URL 情况及其结果:


  • /:显示没有父 id 的第一个分类
  • /category?categoryID=2:显示 id 值为 2 的分类。
  • /category/1:显示 id 值为 1 的分类(格式为 TG 0.9)
  • /category:抛出一个 500 错误,这是因为缺少分类 id。
  • /xyz:抛出一个 404 错误

图 2 给出了分类显示的页面:

图 2. 分类显示

[size=1.16em]


产品显示

对于产品显示页面来说,我们要创建一个 product 控制器,它会从数据库中检索出一个产品,并将其传递给 product Kid 模板进行呈现。

清单 14. 增加产品控制器方法
  1. @expose("tgcommerce.templates.product")
  2. def product(self, productID):
  3.     from model import Product
  4.     product = Product.get(productID)
  5.     return dict(product=product)
复制代码


product.kid 模板有一个产品信息表。此处要注意用来显示价格(有两位小数)的 Python 字符串的格式:

清单 15. 分类页 kid 模板文件(product.kid)
  1. <table id="product-info">
  2.   <tr>
  3.     <td class="fld">Name:</td>
  4.     <td class="val"><span py:replace="product.name" /></td>
  5.   </tr>
  6.   <tr>
  7.     <td class="fld">SKU:</td>
  8.     <td class="val"><span py:replace="product.sku" /></td>
  9.   </tr>
  10.   <tr>
  11.     <td class="fld">Price:</td>
  12.     <td class="val">$<span py:replace="'%.2f' % product.price" /></td>
  13.   </tr>
  14. </table>
复制代码


图 3 给出了产品显示页面:

图 3. 产品显示页面

[size=1.16em]











心晴的时候,雨也是晴;心雨的时候,晴也是雨!
扣扣:407117636,欢迎一块儿吐槽!!

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-2 00:45