在相应的控制器函数(action)被执行后,web2py会自动调用视图。该视图的作用是将返回字典中的变量呈现成HTML。视图文件是用HTML语言编写的,并用分隔符{{and}}分隔嵌入的Python代码。这完全不同于PHP代码,因为嵌入到HTML中的码是“表示层”码。"layout.html"文件由web2py提供,并在视图文件的开始被引用,该文件构成了所有web2py应用的基本布局。该布局文件可以很容易地被修改或替换。
web2py是众多web应用框架中的一种,但是它有引人注目的、独特的功能。web2py最初被开发成一种教学工具,最初的开发动机如下:
web2py由如下组件构成:
-
库(libraries):提供web2py核心功能,可通过编程访问。
-
web服务器:Rocket WSGI web服务器。
-
管理(admin)应用:用于创建、设计和管理其它web2py应用。admin提供了一个完整的基于web的集成开发环境(IDE),用于开发web2py应用。它还包括其它功能,如基于web的测试和shell。
-
示例(examples)应用:包含文档和交互示例。应用示例是官方网站web2py.com的副本,并包含epydoc文档。
-
欢迎(welcome)应用:是其它应用的基本构建模板。默认时,它包含一个纯CSS层叠菜单和用户认证(在第九章讨论)。
web2py以源代码或二进制形式发行,适用于微软windows或Mac OS X操作系统。
源代码发行版可以在任何支持Python的平台上运行,并且包含了上述所有组件。为了运行源代码,你需要预先安装Python 2.5。同时,还需要安装一种支持的数据库引擎。为了测试和轻量级需求的应用,你可以使用内置于Python 2.5中的SQLite数据库。
web2py的二进制版本(适用于Windows和Mac OS X)包含Python2.5解释器和SQLite数据库。从技术上讲,这两个部分并不是web2py的组件。将它们包含在二进制发行版中,是为了使您能够直接运行web2py。
下图描绘了web2py的整体结构:
授权
license
web2py在LGPL版本3许可证下授权。关于该许可证的全部内容,请参阅参考文献
[
lgpl3
]
。
依照LGPL许可,用户可以:
-
将web2py与您的应用一起重新发行(包括官方web2py二进制版本)
-
在您希望的任何许可证下,发布你开发的使用官方web2py库文件的应用
与此同时,您必须遵守:
-
在文档中明确表示,您的应用使用了web2py
-
依照LGPLv3许可证,发布对web2py库的任何修改
LGPLv3许可证包含以下声明:
在适用法律允许的范围内,本程序没有担保。除另有书面注明外,版权持有人和/或其它方按现状提供程序,没有任何形式的明示或暗示的担保,包括但不仅限于针对特定用途的适销性和适用性暗示担保。程序的质量和性能的全部风险由你承担。如果程序证明有缺陷,你承担所有必要的维修、修理或更正的费用。
除非适用法律要求或书面同意,按照上述允许修改和/或传达程序的任何版权持有人或任何其它方都不承担损害赔偿责任,包括因为使用或没有能力使用程序而产生的任何一般的、特殊的、偶然或必然损害(包括但不仅限于数据丢失、数据呈现不准确、由您或第三方遭受的损失或程序未能与任何其它程序协作),即使持有人或其它方已被告知此类损害的可能性。
早期版本
web2py的早期版本1.0.*-1.90.*在GPL2许可下发布,商业授权例外,为了实用目的,它非常类似于当前的LGPLv3。
第三方软件
在gluon/contrib/文件夹、各种JavaScript和 CSS文件中,web2py包含第三方软件。在文件中声明的原许可证下,这些文件与web2py一起发布。
致谢
web2py最初由Massimo Di Pierro开发并拥有版权。 2007年10月发行第一个版本(1.0)。此后,web2py被许多用户使用,其中一些用户也贡献了相关的错误报告、测试、调试、补丁和本书的校对。
按照名字的字母顺序,一些主要贡献者如下:
Alexey Nezhdanov, Alvaro Justen, Andrew Willimott, Angelo Compagnucci, Anthony Bastardi, Antonio Ramos, Arun K. Rajeevan, Attila Csipa, Bill Ferret, Boris Manojlovic, Branko Vukelic, Brian Meredyk, Bruno Rocha, Carlos Galindo, Carsten Haese, Chris Clark, Chris Steel, Christian Foster Howes, Christopher Smiga, CJ Lazell, Cliff Kachinske, Craig Younkins, Daniel Lin, David Harrison, David Wagner, Denes Lengyel, Douglas Soares de Andrade, Eric Vicenti, Falko Krause, Farsheed Ashouri, Fran Boon, Francisco Gama, Fred Yanowski, Gilson Filho, Graham Dumpleton, Gyuris Szabolcs, Hamdy Abdel-Badeea, Hans Donner, Hans Murx, Hans C. v. Stockhausen, Ian Reinhart Geiser, Ismael Serratos, Jan Beilicke, Jonathan Benn, Jonathan Lundell, Josh Goldfoot, Jose Jachuf, Josh Jaques, José Vicente de Sousa, Keith Yang, Kenji Hosoda, Kyle Smith, Limodou, Lucas D'Ávila, Marcel Leuthi, Marcel Hellkamp, Marcello Della Longa, Mariano Reingart, Mark Larsen, Mark Moore, Markus Gritsch, Martin Hufsky, Martin Mulone, Mateusz Banach, Miguel Lopez, Michael Willis, Michele Comitini, Nathan Freeze, Niall Sweeny, Niccolo Polo, Nicolas Bruxer, Olaf Ferger, Omi Chiba, Ondrej Such, Ovidio Marinho Falcao Neto, Pai, Paolo Caruccio, Patrick Breitenbach, Phyo Arkar Lwin, Pierre Thibault, Ramjee Ganti, Robin Bhattacharyya, Ross Peoples, Ruijun Luo, Ryan Seto, Scott Roberts, Sergey Podlesnyi, Sharriff Aina, Simone Bizzotto, Sriram Durbha, Sterling Hankins, Stuart Rackham, Telman Yusupov, Thadeus Burgess, Tim Michelsen, Timothy Farrell, Yair Eshel, Yarko Tymciurak, Younghyun Jo, Vidul Nikolaev Petrov, Vinicius Assef, Zahariash.
若有遗漏,我表示抱歉。
我特别感谢Jonathan, Mariano, Bruno, Martin, Nathan, Simone, Thadeus, Tim, Iceberg, Denes, Hans, Christian, Fran 和 Patrick对web2py作出的重大贡献。感谢Anthony, Alvaro, Bruno, Denes, Felipe, Graham, Jonathan, Hans, Kyle, Mark, Michele, Richard, Robin, Roman, Scott, Shane, Sharriff, Sriram, Sterling, Stuart, Thadeus对本书所做的校对。他们的贡献是无价的。如果你在本书中发现任何错误,责任完全归咎于我。错误可能是由于是编辑匆忙造成的。我还要感谢Wiley Custom Learning Solutions的Ryan Steffen 帮助我出版了这本书的第一版。
web2py中包含以下作者的代码,在此我也表示感谢:
Guido van Rossum for Python
[
python
]
, Peter Hunt, Richard Gordon, Timothy Farrell for the Rocket
[
rocket
]
web server, Christopher Dolivet for EditArea
[
editarea
]
, Bob Ippolito for simplejson
[
simplejson
]
, Simon Cusack and Grant Edwards for pyRTF
[
pyrtf
]
, Dalke Scientific Software for pyRSS2Gen
[
pyrss2gen
]
, Mark Pilgrim for feedparser
[
feedparser
]
, Trent Mick for markdown2
[
markdown2
]
, Allan Saddi for fcgi.py, Evan Martin for the Python memcache module
[
memcache
]
, John Resig for jQuery
[
jquery
]
.
本书封面由Young Designers的Peter Kirchner设计。
感谢Helmut Epp(DePaul University教务长)、David Miller(the College of Computing and Digital Media of DePaul University院长)和Estia Eichten(MetaCryption LLC会员)对我的一直的信赖和支持。
最后,我想感谢我的妻子Claudia和儿子Marco,他们体谅我花了许多时间来开发web2py、与用户和合作者交换电子邮件及撰写本书。这本书是献给他们的。
关于本书
除引言外,本书还包含以下章节:
-
第2章简要介绍了Python。假定读者具有编程的基本知识和面向对象编程的基本概念,例如循环、条件转移、函数调用和类。本章主要包括Python的基本句法和本书所用的Python模块的例子。如果您已经熟悉Python语言,可以跳过该章。
-
第3章展示如何启动web2py,介绍了管理界面,引导读者熟悉了以下复杂性不断增加的例子:返回字符串应用、计数器应用、图片日志、完善的wiki应用,该应用允许上传图片、用户评论,提供验证、授权、web服务和RSS订阅。阅读本章时,你可能需要参考第2章有关Python句法和后面章节中所用函数的详细介绍。
-
第4章系统化介绍web2py的核心结构和库文件: URL映射、请求、响应、会话、缓存、cron、全局化和一般工作流程。
-
第5章介绍用于创建视图的模板语言。展示了如何向HTML中嵌入Python代码,演示了帮助对象的使用方法(能生成HTML的对象)。
-
第6章介绍数据库抽象层或DAL。通过一系列的例子介绍了DAL句法。
-
第7章介绍表单、表单验证和表单处理。FORM是低层次的用于创建表单的帮助对象。SQLFORM是高层次的用于创建表单的帮助对象。本章还讨论了创建/读取/更新/删除(CRUD)API。
-
第8章介绍了与发送邮件和SMS有关的信息。
-
第9章介绍web2py中的用户验证、用户授权和扩展的基于角色的访问控制机制。还介绍了用于用户验证的mail设置和CAPTCHA。在本书第3版中,我们增加了有关与第三方验证机制集成的内容,如OpenID、OAuth、Google、Facebook、LinkedIn等。
-
第10章涉及web2py创建web服务的内容。我们提供了一些有关集成的例子,例如通过Pyjamas和Google Web Toolkit集成,通过PyAMF和Adobe Flash集成。
-
第11章涉及web2py和jQuery使用的方法。web2py主要用于服务器端编程,但它包含jQuery,因为我们发现jQuery是最好的开源JavaScript库,能用于效果和Ajax。本章介绍如何有效地使用jQuery 和web2py。
-
第12章介绍web2py组件和插件以及构建模块化应用的方法。我们给出了一个使用插件实现许多常用功能的例子,例如图表、注释、标注和wiki。
-
第13章涉及web2py应用的生产部署。我们主要陈述3种可能的生产场景:在一个Linux web服务器或一组服务器(我们考虑的主要替代部署),在微软的Windows环境下运行,在Google 应用引擎上部署。在本章中,我们还讨论了安全性和扩展性问题。
-
第14章介绍了一些用于解决特定问题的方法,包括升级、地理编码、分页、Twitter API等等。
本书只介绍web2py的基础功能及web2py附带的API。本书不对web2py appliances(即现成的应用)作介绍。
您可以从相应的网站
[
appliances
]
.下载web2py 应用范例。
您可以在AlterEgo
[
alterego
]
上找到讨论的其它主题,进行交互式web2py常见问题解答。
本书的写作采用了markmin
MARKMIN
句法,它能自动转换成HTML、LaTeX 和PDF文档。
样式的元素
在使用Python编程时,PEP8
[
style
]
包含优良的样式实践。你会发现web2py并不总是遵循这些规范。这不是因为遗漏或疏忽;我们认为web2py的用户应该遵循这些规则,并且我们鼓励这样做。在定义web2py帮助对象时,我们选择不遵循PEP8的某些规则,以尽量减少用户自定义对象与帮助对象发生命名冲突的概率。
例如,表示<div>的类被称为DIV,然而根据Python样式参考,它应该被称为Div。我们相信,对于这个具体的例子,使用全大写的"DIV"是一个更自然的选择。此外,如果程序员愿意的话,这种方法让他们自由选择创建一个称为“Div”的类。我们的句法能自然地映射成大多数浏览器(包括,例如,火狐)使用的DOM标记。
根据Python的样式指南,常量的命名应使用全大写字符串,但变量的命名不能这么做。继续我们的例子,即使考虑到DIV是一个类,它也是一个用户不应该修改的特殊类,因为修改它会破坏其它的web2py应用。因此,我们认为DIV类应该被当做常量对待,进一步证明了我们选择的记号是合理的。
总之,下列习惯应该被遵守:
-
HTML帮助对象和验证都采用大写(例如DIV, A, FORM, URL),这么做的理由前面已经讨论过了。
-
转换对象T采用大写,尽管事实上它只是类的一个实例而不是一个类。从逻辑上说,转换(translator)对象执行的动作类似于HTML帮助对象,它会影响演示文稿的呈现。此外,在代码中需要对T方便的定位,它必须有一个简短的名称。
-
DAL类遵循的Python样式指南(首字母大写),例如Table、Field、Query、Row、Rows等等。
对于所有其它情况,我们相信已尽可能多的遵循了Python样式指南(PEP8)。例如,所有的实例对象都是小写(request, response, session, cache),所有的内部类都是大写。
在本书的所有例子中,web2py关键字都以粗体显示,字符串和注释都以斜体显示。
licensed under
Creative Common License BY-NC-ND 3.0