中国开发网: 论坛: 程序员情感CBD: 贴子 730390
haitao
web2py cookbook翻译
web2py cookbook翻译(最新更新2008.04.03下午)
2008-03-20 13:02注:本文翻译自web2py的cookbook.pdf,
下载网址是:http://mdp.cti.depaul.edu/examples/static/cookbook.pdf
翻译时用的版本是:2008年3月17日,5:57:19的版本。共计48页。
我的信箱:otherrrr@gmail.com

web2py 大全

拥抱web2py
Massimo Di Pierro创建(之前名为Gluon)

也许你曾经听说过web2py,是Web框架(Web Framework)中的新成员。
web2py由Python编写,因此它可靠而且比Ruby on Rails要更快。
web2py本身也是一个Web应用程序,因此你可以通过Web浏览器来做所有的开发、
部署、以及维护你的Web应用程序,这使得它比其他框架更易于使用。
此外,web2py发布时是一个完整的包(可以发布到Windows、Mac或Unix/Linux),
这个包包括所有开发用到的东西(包括Python、SQLite3以及多线程Web服务器)。

你可以在下面这个网址获取web2py:
http://www.web2py.com
(译注:上面这个网址不好用,至少在我这里不好用。
建议访问:http://mdp.cti.depaul.edu/)
这个文档故意做成和
http://onlamp.com/pub/a/onlamp/2005/01/20/rails.html
一样,这样你就可以比较web2py和Rails了。
(译注:上面这个网址是:Rolling with Ruby on Rails,
和此篇的标题Rolling with web2py一模一样,
而其中的结构也几乎一样。
我把rolling with翻译成拥抱,也许有更好的翻译。)

·Python是什么?
Python是面向对象的程序语言,教学起来没有任何困难。
绝大多数Java算法用Python重写之后只有原来的十分之一长度。
Python包含了大量的独立标准库,包括对许多网络协议的支持
(http、xml、smtp、pop和imap,而且还有更多)以及针对
操作系统的API。

·web2py是什么?
web2py是一个用Python编写的开源Web框架,并可用Python来
进行快速的基于数据库驱动的Web应用程序开发。当前我们可以
看到很多Web框架,包括:Ruby on Rails、Django、Pylons和
Turbo Gears,那么为什么要选择另一个呢?

我开发web2py时,脑子里有下列目标:

1) 尽可能的和Rails一样,但是要用Python来写,
这样它才能更稳定、更快。

2) 不需要安装,不需要配置,不需要命令行脚本,只有一个包

3) 更容易应用到教学中(我的工作是教学)。
因此我制作了web2py这样一个Web应用程序。

4) 设计组织严密,这样web2py API才能一直很稳定。

·眼见为实
用web2py编程和用Rails编程一样容易,
但是假如你既不会Python也不会Ruby,
web2py会比Rails更易于学习。

最重要的是web2py会比J2EE或PHP需要更少的代码,
同时坚持了良好的、安全的编程风格。

web2py防止了目录跨越(directory traversal)、SQL注入、跨站点脚本以及
重放攻击(reply attack)。

web2py可以管理session、cookies以及应用程序错误。
所有的应用程序错误会给用户一个错误提示,
并给管理员一个日志条目。

web2py可以写所有的SQL。
它甚至可以创建表格,并决定什么时候进行一个数据库移植(migration)。

来试一下吧!

·软件的安装
访问http://mdp.cti.depaul.edu/examples,
并下载对应的Windows、Mac或Unix文件。

如果你选择的是Windows或Mac版本,你不需要做其他任何事情:
解压这个文件,并点击web2py.exe或web2py.app。

如果你选择的是Unix版本,你需要Python解释器(2.4版本或更高)
以及SQLite3数据库。当你安装好这些之后,解压web2py并执行

python web2py.py

作为一个产品,你应该使用PostgreSQL或MySQL,不要使用SQLite3.
从web2py的角度来说:替换程序中的一行是非常容易的,
但是我们不在这里讨论,因为你不需要用它来开发。
(译注:这一段我个人理解的意思是推荐使用PostgreSQL或MySQL。
好像可以先用SQLite3,然后再替换成上面两个。)
(译注:PostgreSQL和MySQL并没有在Windows和Mac版本中,
如果想要运行这两个数据库,或者Oracle数据库,
需要源码版本。详细部分可参看官方FAQ:
http://mdp.cti.depaul.edu/AlterEgo/default/show/60)

·运行web2py
web2py启动时会提出一个问题:“输入管理员密码”。
请出入一个。
之后web2py会打开一个网络浏览器(请记住不要在命令行输入!)
显示如下所示欢迎页面。
(译注:此处有图片)
点击“administrative interface”(管理员接口)
(译注:此处有图片)
然后输入在启动阶段时设定的密码。
之后会转到管理员接口的“site”(网站)页面:
(译注:此处有图片)
在这个页面你可以:
·安装和卸载应用程序
·创建和设计(编辑)应用程序
·清理错误的日志和会话(session)
·用于发布和快速执行来二进制编译应用程序

web2py来自于3个应用程序:admin(管理员接口本身),
examples(交互式文档),以及welcome(一个基本的模板,可用于其他应用程序)。

我们开始写代码吧
我们创建了一个用来存放和共享解决方案的在线协作大全(cookbook)。
我们希望我们的大全成为:
·显示所有解决方案的列表
·创建新的解决方案和编辑已有的解决方案
·标注解决方案的类别(比如“甜点”或“汤”)。
(译注:cookbook的本意是菜谱)
如果愿意的话,你可以下载整个web2py大全的例子,并来参照。

创建一个空web2py应用程序
在适当的区域中输入一个名称,来启动一个新的应用程序,
例如:cookbook,并点击按钮submit(提交):
(译注:此处有图片)
一个新的web2py应用程序并不是空的,因为它是welcome应用程序的一个克隆。
它包括一个简单的控制器,一个简单的试图,一个基本的版面设计,
一个通用的视图和它自己的数据库管理员接口,
这个接口被称为appadmin(不要和admin弄混了,admin是整个网站的管理员接口)。

测试这个空Web应用程序
如果你已经运行了web2py的Web服务器,实际上没有什么可测试的。
不管怎么样,点击cookbook/design,然后你会看到
(译注:此处有图片)
在这里可以参看/创建/编辑你的应用程序的组件。
在Controllers下面有一个文件:default.py,用来“显示主页面”。
如果你点击你最新创建的这个应用程序的主页面(index),
就会显示“welcome you”。

web2py模型视图控制器设计(web2py Model View Controller Design)
任何web2py应用程序都由下列部分组成:
·Models:该组文件包含应用程序存储的数据的描述。
例如数据库表中的域,它们的关系以及需求。
web2py提示哪些表格被model文件所定义。
·Controllers:该组文件包含应用程序的逻辑。每个URL独立映射到
controller文件中的一个函数。该函数可以生成一个页面,模拟出一个
页面的视图,重定向到另一个URL或引发一个异常(取决于异常会导致
问题描述或HTTP错误页面)。web2py会提示哪些函数被controller文件所调用。
·Views:该组文件包含HTML和特定{{}}标签,这些标签会提交(render)HTML中
的标量并由controller返回。这是应用程序的表现层。当视图(view)被扩展
或导入其他view的时候web2py会给出提示。
·Languages:该组文件包含所有字符串想要支持的语言的翻译表格
(这些字符串取决于你明确标出的依赖语言)。
·静态文件:其他文件,包括图片、CSS、JavaScript等等。

需要提醒的是:你不需要一个编辑器或者了解web2py的目录结构,
因为你可以通过design页面创建和编辑文件。

还有一点也需要提醒:给每一个controller函数一个view是一个非常好的策略
(这也可以称之为“围栏中的操作”(action in rails)),
当然这也不是必须的,web2py会提供一个generic.html视图,
因此可以呈现任何没有模板的页面。

网址和控制器(URLs and Controllers)
下面的图片表现了web2py的核心功能的主要结构
(译注:此处有图片,“Gluon Web Framework”)
(译注:Gluon是web2py的前用名,文档中的图片很多地方还是用Gluon)
一个URL:
http://hostname/cookbook/default/index/bla/bla/bla?variable=value
会引起应用程序cookbook中的controller中的default.py中的函数index()的调用。

“bla”、“bla”和“bla”会被作为request.args[0:3]传递,
同时“value”会被存储为request.vars.variable。

Controller函数会返回一个字典,如下:
return dict(name=value, othername=othervalue)
变量name和othername会被传递到相关的视图。

马上试一下,在cookbook/design中,创建一个test.py的controller
(只需要键入名称并点击提交),然后编辑test.py并创建你自己的index函数。
(译注:此处有图片,显示了一行代码)

返回到cookbook/design并点击test.py的index函数。
(译注:此处有图片)

web2py正在使用generic.html视图,这个视图扩展了基本的layout.html,
用来呈现index()函数返回的变量文本。

激动人心的事情开始了……

创建一个Model
打开cookbook/design,并创建一个新样式(model),名称未db.py
(只需要在对应的区域输入db,然后点击提交即可)。
在这里model的定义和在Rails稍微有些不同。
在web2py中一个model是一个包含每个数据库中所有表的定义的文件。
(译注:此处有图片)
编辑刚刚创建的db.py model,写入如下代码:
(译注:此处有图片,图片仅包括代码,我将代码全部抄写如下)
import datetime; now=datetime.date.today()
db=SQLDB('sqlite://db.db')

db.define_table('category', SQLField('name'))

db.define_table('recipe',
SQLField('title'),
SQLField('description',length=256),
SQLField('category',db.category),
SQLField('date','date',default=now),
SQLField('instructions','blob'))

db.category.name.requires=[IS_NOT_EMPTY(),IS_NOT_IN_DB(db,'category.name')]
db.recipe.title.requires=[IS_NOT_EMPTY()]
db.recipe.description.requires=IS_NOT_EMPTY()
db.recipe.category.requires=IS_IN_DB(db,'category.id','category.name')
db.recipe.date.requires=IS_DATE()

这个model定义了两个表(table):category(类别)和recipe(方案)。
recipe哟一个域category,该域引用db.category,域date默认为当天。
每个域都有一些要求(可选),category.name要要一个新值IS_NOT_IN_DB
(这个域必须是唯一的),recipte.category要要域IS_IN_DB(引用有效),
recipte.date要求包含一个有效日期。

这些要求必须强制执行在所有输入表格中,无论管理员接口部分或用户生成部分。

数据库管理接口(appadmin)
打开cookbook/design,然后在model下面,可以看到两个新的数据库链接:
administration和sql.log。点击前者,如果没有什么输入错误的话你会看到:
(译注:此处有图片,内容为大标题:Avaliable databases and tables)
(小链接:db.category和db.recipe)
这就是应用程序管理接口。试着插入一条category(类别)记录:
(译注:此处有图片)
并插入一些新的recipes(方案):
(译注:此处有图片)
这难道不比Rails简单吗?更不用和PHP、JSP、ASP、J2EE等等相比了。

是谁创建了这些表格?web2py!web2py会查找名为db.db的数据库,
如果未找到,它就会创建这个数据库以及定义的表格。
如果你修改了表格的定义,web2py也会修改该表格(SQLite3只支持
添加域,Postgresql还支持删除域)。如果你定义了其他的表格,
同样也会被创建。点击sql.log可以查看用来完成此动作web2py所生成的SQL语句。

请放心的探索管理接口,试着插入一些记录,然后列出它们。
(译注:此处有图片)
这个表格可以通过点击标题来进行排列,另外如果多于100项,则会添加页标。
试试JOIN(添加),在SQL FILTER域中输入“recipe.category=category.id”。
(译注:此处有图片)
域id从哪里来的呢?在web2py的每个表格中都有一个唯一的十进制值:id。
如果你点击表格中的这个id值,就可以修改这个单独的记录。

注意:appadmin.py是你的cookbook应用程序的一部分,
所以你可以查看它并修改它。在这个教程中我们不这么做,我们希望花费一些
周折,并从草稿开始来写一个新的控制器(controller)。
我们相信这会更符合我们的教学目的。

创建函数(动作)
同样在cookbook/design中,编辑test.py的controller并添加如下代码:
def recipes():
records=db().select(db.recipe.ALL,orderby=db.recipe.ttle)
return dic(records=SQLTABLE(records))

然后返回设计(design),点击“recipes”就会看到:
(译注:此处有图片)
注意:
(正在翻译中……)

创建Views
(未翻译)

一些技巧(Some Magic)
如果你试着提交一个表格,但是却不满足要求
(例如试图提交一个空的解决方案),web2py会提醒你这个问题。
(译注:此处有图片)

结论
我们已经写了一个可以工作的web2py应用程序,而这些工作都仅仅是在
浏览器内完成的,而且只需要一些点击和总共53行的代码。
我们也有了一个数据库管理接口,并可以插入(insert)、选择(select)、
更新(update)和删除(delete)独立的数据或数据集。

web2py也包含非常容易的方式来导入和到处CSV中的表格,或生成RSS连接和RTF
文件(可被MS Word兼容),并可以处理AJAX的JSON。
(译注:JSON和XML争论很厉害)

了解关于web2py的更多信息,请访问网站:
http://mdp.cti.depaul.edu

如果有问题,请加入我们的Goolge组:
http://groups.google.com/group/web2py?hl=en

附录:数据库API
连接sqlite3数据库文件test.db
>>> db=SQLDB("sqlite://test.db")

连接MySQL数据库
>>> db=SQLBD("mysql://username:password@host:port/dbname")
(未翻译)

web2py API
URL映射一览图
(译注:此处有图片)
容器对象
request, response, session, cache
导航函数和对象
redirect, HTTP
国际化(i18n)
T
视图助手
XML, URL, BEAUTIFY
HTTP构造对象
A, B, BODY, BR, CENTER, CODE, DIV, EM, EMBED, FORM,
H1, H2, H3, H4, H5, H6, HEAD, HR, HTML, IMG, INPUT,
LI, LINK, LO, LU, META, OBJECT, ON, OPTION, P, PRE,
SCRIPT, SELECT, SPAN, STYLE, TABLE, TD,
TEXTAREA, TH, TITLE, TR, TT

有效性对象
IS_ALPHANUMBERIC, IS_DATE, IS_DATETIME, IS_EMAIL,
IS_EXPR, IS_FLOAT_IN_RANGE, IS_INT_IN_RANGE, IS_IN_SET,
IS_LENGTH, IS_MATCH, IS_NOT_EMPTY, IS_TIME, IS_URL,
CLEANUP, CRYPT, IS_IN_DB, IS_NOT_IN_DB

数据库API
SQLDB, SQLField

数据库到HTML
SQLFORM, SQLTABLE
(译注:本小节原PDF文件的形式为:每个关键字都有一个链接,
链接形式为:http://127.0.0.1:8000/examples/global/vars/xxx,
xxx即为该关键字)

web2py例子
简单的例子
例子1
...
例子13
会话(session)的例子
例子14
模板的例子
例子15
...
例子22
页面设计的例子
例子23
例子24
例子25
表格的例子
例子26
数据库的例子
例子27
...
例子34
缓存(cache)的例子
例子35
...
例子41
Ajax例子
例子42
...
例子44
(未翻译)

web2py的面向对象映射API
例子
(未翻译)

——也没感觉ror的开发效率怎么高啊?也许比java开发web应用是高效多了。。。。。
——不知道这个的运行效率如何。。。。。。。。。
我的blog:http://szhaitao.blog.hexun.com & http://www.hoolee.com/user/haitao
--以上均为泛泛之谈--
不尽牛人滚滚来,无边硬伤纷纷现 人在江湖(出来的),哪能不挨刀(总归是要的)
网络对话,歧义纷生;你以为明白了对方的话,其实呢?

您所在的IP暂时不能使用低版本的QQ,请到:http://im.qq.com/下载安装最新版的QQ,感谢您对QQ的支持和使用

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录