地址:
http://www.python-cn.cn也许你已经听过说web2py,它是Web开发框架中的新成员。web2py使用Python进行编写,所以它很可靠并且比Ruby on Rails快。web2py本身也是一个web应用,所以你可以通过浏览器对你的应用程序进行所有的开发、部署和维护,而这种方式使得它比其它任何框架都易于使用。除此之外,web2py被打成一个完整的包(可用于Windows, Mac或Unix/Linux),同时包含了开发所需要的一切(包括Python, SQLite3, 和多线程web服务器). [译注: 现在是cherrypy]
你可以从这里得到web2py: http://www.web2py.com 。这篇文档在设计时有意模仿了 http://onlamp.com/pub/a/onlamp/2005/01/20/rails.html 。这样你就可以同Rails进行比较了。
2
什么是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的开发的:
尽可能象Rails, 但是用Python来开发,这样可以更稳定和更高效。
1
一体化的包,不需要安装、无配置和不需要shell脚本。
超级容易教学(我的工作是教学)。所以我把web2py本身也做成了一个web应用程序。
从上到下的设计,这样web2py的API从头一天开始就是稳定的。
眼见为实
web2py编程象Rails编程一样容易,但如果你既不会Python也不会Ruby,web2py学起来要比Rails容易多了。
最重要的是,与同等功能的J2EE或PHP相比,web2py所需的代码量要少,同时它强迫你使用一种非常好并且安全的编程习惯。
web2py阻止目录遍历,SQL注入攻击(SQL injection),跨站脚本执行(cross site scripting),和回复攻击弱点(reply attack vulnerability)。
web2py替你对session,cookie和应用错误进行管理。所有应用错误都会生成一个ticket发送给用户,并且会为管理员生成一条日志项。
web2py会为你编写所有的SQL。它甚至可以创建表并决定何时执行一个数据库迁移的动作。
试一下吧。
软件安装
访问 http://mdp.cti.depaul.edu/examples 并下载Windows, Mac或Unix文件。
如果你选择使用Windows或Mac版本,你只需要执行:unzip文件,然后分别点击web2py.exe或wweb2py.app。
如果你选择使用Unix版本,你需要安装Python解释器(版本2.4或更高)和SQLite3数据库。 [译注:2.4与2.5有些区别。在2.5中使用sha512的摘要算法,而2.4只使用sha。同时2.5内置了sqlite,因此不需要安装。如果有加密数据,则2.4与2.5下的版本处理可能有不同,需要注意。] 有了这些之后,unzip web2py然后运行
python web2py.py在生产配置中,你应该使用PostgreSQL或MySQL而不是SQLite3。从web2py的角度来看,修改配置象修改程序中的一行代码一样简单,不过在这里不讨论它,因为开发中你不需要关心它。
运行web2py
在启动时,web2py会问一个问题: “choose the administrator password”,选择一个。在那之后,web2py会替你打开一个web浏览器(记住未曾输入过命令!),同时显示这个欢迎页面
2
点击 “administrative interface”
然后输入在启动时选择的口令。你应该被重定向到管理界面的”site”页面:
这里你可以:
安装和反安装应用程序
创建和设计(编程)你的应用程序
清理错误日志和session
以字节码方式编译应用程序用来分发和快速执行
web2py自带了三个应用程序: admin (管理界面本身), examples (交互文档), 和 welcome (可用来创建其它应用程序的基础模板)。
开始写代码
我们将创建一个在线的协作方式的 cookbook ,用来保存和分享菜谱。我们想让我们的食谱书有以下功能:
显示所有菜谱的清单。
创建新菜谱和编辑存在的菜谱。
给菜谱设定 category (象”dessert”(餐后甜点)或”soup”(汤))。
如果需要,你可以下载完整的web2py Cookbook例子并且跟着做。
创建一个空的web2py应用程序
为创建一个新的应用,在合适的字段 [译注:create new application] 上输入一个名字 (在本例中为cookbook),然后点击Submit按钮:
一个新的web2py应用程序不是空的,它是welcome应用程序的克隆。它包含单个controller(控制器),单个view(视图),基本layout(布局),通用view和称为appadmin(不要与admin混了,admin 是整个站点的管理界面)的数据库管理界面。
测试空的Web应用程序
你已经运行了web2py web服务器,所以其实没有什么可以测试的。不管怎么样,在 cookbook/design 上点击,你会看到
在这里你可以查看/创建/编辑你的应用程序组件。在 Controllers 下,有一个叫做 default.py 的文件,带有 “exposes index”。如果你在 index 上点击,你创建的新应用程序会 “welcome you”
web2py Model(模型) View(视图) Controller(控制器) Design(设计)
任何web2py应用程序由以下内容组成:
Models: 用来描述你的应用程序的数据存储的文件。例如,你的数据库表中的字段、它们的关系和要求。web2py会告诉你在每个model文件已经定义了哪些表。 [译注: model.tables?]
Controllers: 包含你的应用程序处理逻辑的文件。每个URL唯一映射到一个controller 文件的一个函数上。这个函数可以生成页面、委派一个view来渲染一个页面、重定向到另一个URL或引发一个异常(根据异常的不同,有可能会产生一个ticket或出现在一个 HTTP错误页面中)。web2py会告诉你每个controller文件所暴露出来的函数。 [译注:如果在controller中的函数使用``__``开始,如``def __init()``,它将是一个私有函数,不会被暴露出来,符合Python定义的习惯。]
Views: 包含HTML和特殊的 {{ }} 标签的文件。这些标签可以在由controller中返回的变量中进行渲染。这是你的应用程序的展现层。web2py会告诉你何时一个view从其它的 view中进行扩展(extend)或导入。
Languages: 包含所有你想要支持为其它任一语言的字符串的翻译列表的文件。这些字符串需要你明确标识为语言依赖。 [译注:在需要翻译的字符串使用T()函数进行封装。不过目前好象只能用在controller, view, model中。对于其它的模块好象还不支持。]
Static files: 其它的所有文件,包括图片、CSS、Javascript,等等。
注意,你既不需要一个编辑器,也不需要知道web2py的目录结构,因为你可以通过design 页面来创建和编辑。 [译注:web2py自带的web编辑器可以很好的支持语法高亮,包括 Python。不过对于某些静态文件,如Javascript不能进行修改,希望在以后可以改进。]
还要注意,为每个controller函数(在Rails中叫action)给定一个view是一种好的习惯,不过不一定非要如此,因为当没有指定view( [译注:可以简单理解为模板] )时,web2py 会总是使用 generic.html view来渲染任何页面。
URL和Controller
这张图展示了web2py核心功能的通用结构
一个类似:
http://hostname/cookbook/default/index/bla/bla/bla?variable=value
的链接会产生一个对cookbook应用程序的 default.py controller中的 index() 函数的一个调用。
“bla”, “bla”, 和 “bla” 将被传递为 request.args[0:3] ,而”value”将被保存在 request.vars.variable 中。
controller函数应该象下面一样返回一个dict(字典)
return dict(name=value, othername=othervalue) 这样变量 name 和 othername 将被传到相应的view中。
现在试一试,从 cookbook/design 来创建一个 test.py controller(只需要输入名字并点击Submit),编辑 test.py 然后创建你自已的 index 函数。 [译注:如果文件名不带.py扩展名则web2py会自动添加,其它的也类似。]
回到 cookbook/design 并在 test.py 所暴露出来的 index 函数上点击。
web2py使用了 generic.html view(它是从基础的 layout.html 扩展来的)来对你的 index() 函数返回的变量进行渲染。
激动的时刻开始了...
模型创建
回到 cookbook/design ,然后创建一个叫 db.py 的新model(只需要在适当的字段上输入 db 然后点击Submit)。model定义在这里与Rails有些不同。在web2py中,一个model是一个包含了在每个数据库中 所有表 的定义文件。
编辑刚才创建的 db.py model,然后输入下面的代码:
这个model定义了两个表 category 和 recipe 。**recipe** 有一个 category 字段,它是一个对 db.category 的引用,并且 date 字段缺省为今天。每个字段有一些要求(这是可选的), categore.name 要求一个新值要满足 IS_NOT_IN_DB(字段必须唯一), recipe.category 要求这个字段满足 IS_IN_DB(引用是有效的), recipe.date 要求它要包含一个有效的日期。 [译注:如果你同时希望它可以为空,或不为空时需要为有效的日期格式,可以使用 IS_NULL_OR(IS_DATETIME())]
2
这些要求将被强制使用在任一入口的表单中,无论它是管理界面部分或用户生成的部分。 [译注:web2py会提供象SQLFORM这样的东西进行记录的录入,用户也可以使用它。而SQLFORM会对字段的约束项进行检查]
数据库管理界面(appadmin)
回到 cookbook/design ,在model下,你会看到两个新的链接,分别为 database administration 和 sql.log 。在前者上点击,如果不存在拼写错误时你会看到:
这是你的数据库管理界面。试着插入一个新的category记录:
和一些新的菜谱:
这难道不比Rails简单吗?甚至都不需要和PHP、JSP、ASP、J2EE等相比。
是谁创建的这些表呢?web2py干的!web2py会查找一个叫做db.db的数据库( [译注:在SQLDB中定义的文件名,因为使用的是SQLite3数据库。同时使用SQLite3你还可以使用绝对路径。否则它会在你的应用程序目录下的databases子目录下创建这个数据库文件。]),如果找不到,那么它会创建这个数据库和你刚才定义的表。如果你修改了一个表的定义,web2py会替你修改表结构。如果你定义了另一张表,它会被创建。你可以看一下由web2py为这种迁移所生成的SQL,通过点击 sql.log 。
随便探索管理界面,插入几条记录,并试着列出它们。
这张表可以通过点击表头进行排序,并且当记录超过100条时会进行分页。试一下JOIN(表的联接操作),在SQL FILTER字段上输入 recipe.category=category.id 。
字段 id 是从哪来的?在web2py中的每张表都有一个唯一的整数键叫做 id 。如果你在表的 id 值上点击,你就可以单独修改这条记录。
注意 appadmin.py 是你的cookbook应用程序的一部分,所以你可以对它进行阅读和修改。在这个教程中,我们不这样做,而宁愿从头编写一个新的controller。这样会起到更好的宣传作用。
创建函数(Action)
在 cookbook/design 中,编辑 test.py controller 并加入如下代码:
def recipes(): records=db().select(db.recipe.ALL,orderby=db.recipe.title) return dict(records=SQLTABLE(records)) 现在回到design,在 recipes 上点击,你会看到
注意,传给view的变量 records 是一个 SQLTABLE 对象,它知道如何把自身渲染为CSS友好的HTML。变量 records 是由 generic.html view来渲染的。
让我们再改一下。修改controller为:
注意:
recipes 现在返回记录列表,而不是一个SQLTABLE,而且它会从表的 category 字段生成一个选择 表单 .
show 接受 rquest.vars.id ,并且执行选择,一旦失败,它会重定向到 recipes 。
new_recipe 返回一个SQLFORM对象,它可以根据一个表(db.recipe)的定义创建一个HTML表单。 form.accepts() 执行对表单的校验(根据模型中的需求),用错误信息来更新表单,如果检验成功,它插入新记录到数据库中。
URL(r=request,f='function') 可以在当前的应用程序和controller中生成 “function” 的url,根据HTTP请求。
这块代码使用通用view已经可以完全运行,但是我们将在下面的布局层执行额外的客户化处理。
注意,一些检验器(validator),象用于’datetime’字段上的 IS_DATETIME() ,缺省是自动设置的。 [译注:如果你不想使用缺省的validator可以设置字段的 ``field.requires=[]`` ]
创建View
现在为 recipes 创建一个view。这个view叫做 test/recipes.html (在适当的字段上输入带路径的名字然后点击Submit)。
编辑新创建的文件
现在再试着调用 recipes
注意在 {{ }} 标签中的代码是Python代码,需要注意:
不需要缩近,一个代码块以末尾为冒号的行开始,到以开始为pass的行结束(例如:def :return, if:elif:else:pass和try:except:pass)。
view可以看到在model中定义的所有东西加上由controller返回的变量。
{{=something}} 将把 something 渲染成为HTML,之后对特殊字符进行转义。
注意
{{=A(message,_href=link)}}它是一个html辅助函数。会简单地替你输出
<a href= "link">message</a>标签。
创建 test/show.html ,包含:
看上去象这样:
最后创建一个 test/new_recipe.html ,包含:
看上去象这样:
注意web2py在表格中是如何把字段名首字母大写的,并且根据指定的需求为category字段生成了一个 SELECT/OPTION 字段。
如果你不喜欢 [web2py]cookbook 的广告条或它的CSS,你可以在 layout.html 文件中编辑它们。
一些魔术
如果你试图提交一个不满足需求(例如试图提交一个空的菜谱)的表单,web2py会通知你相关的提示信息。
结论
我们已经编写了一个可工作的web2py应用程序,仅仅通过浏览器,几个点击和总共53行代码。我们还得到了一个自由使用的数据库管理界面,它可以让你插入、选择、更新和删除单条记录或记录集。
web2py也包括了容易使用的函数来导入和导出CSV格式的表数据,生成RSS feed和RTF文件(与MS Word兼容),处理JSON用于AJAX。
如果想要了解更多关于web2py,请访问网页: http://mdp.cti.depaul.edu
如果你有问题,请加入Google用户组: http://groups.google.com/group/web2py?hl=en
附录 数据库API
连接到sqlite3数据库文件test.db
>>> db=SQLDB("sqlite://test.db") 或连接到MySQL数据库
>>> db=SQLDB("mysql://username:password@host:port/dbname") 或连接到PostgreSQL数据库
>>> db=SQLDB("postgres://username:password@host:port/dbname") 可用字段类型
>>> tmp=db.define_table('users',\ SQLField('stringf','string',length=32,required=True),\ SQLField('booleanf','boolean',default=False),\ SQLField('passwordf','password'),\ SQLField('textf','text'),\ SQLField('blobf','blob'),\ SQLField('uploadf','upload'),\ SQLField('integerf','integer'),\ SQLField('doublef','double'),\ SQLField('datef','date',default=datetime.date.today()),\ SQLField('timef','time'),\ SQLField('datetimef','datetime'),\ migrate='test_user.table') 一个字段就是一个SQLField类型的对象
>>> SQLField('fieldname', 'fieldtype', length=32,\ default=None,required=False,requires=[]) 删除表
>>> db.users.drop() 插入、选择、更新、删除的例子
>>> tmp=db.define_table('person',\ SQLField('name'), \ SQLField('birth','date'),\ migrate='test_person.table') >>> person_id=db.person.insert(name="Marco",birth='2005-06-22') >>> person_id=db.person.insert(name="Massimo",birth='1971-12-21') >>> rows=db().select(db.person.ALL) >>> for row in rows: print row.name Marco Massimo >>> me=db(db.person.id==person_id).select()[0] >>> me.name 'Massimo' >>> db(db.person.name=='Massimo').update(name='massimo') >>> db(db.person.name=='Marco').delete() # test delete 更新单个记录
>>> me.update_record(name="Max") >>> me.name 'Max' 复杂搜索条件
>>> rows=db((db.person.name=='Max')&\ (db.person.birth<'2003-01-01')).select() >>> rows=db((db.person.name=='Max')| \ (db.person.birth<'2003-01-01')).select() >>> me=db(db.person.id==person_id).select(db.person.name)[0] >>> me.name 'Max' >>> rows=db(db.person.birth.month()==12).select() >>> rows=db(db.person.birth.year()>1900).select() >>> rows=db(db.person.birth==None).select() >>> rows=db(db.person.birth!=None).select() >>> rows=db(db.person.name.upper()=='MAX').select() >>> rows=db(db.person.name.like('%ax')).select() >>> rows=db(db.person.name.upper().like('%AX')).select() >>> rows=db(~db.person.name.upper().like('%AX')).select() orderby, groupby 和 limitby 的使用
>>> people=db().select(db.person.name,orderby=db.person.name) >>> order=db.person.name|~db.person.birth >>> people=db().select(db.person.name,orderby=order) >>> people=db().select(db.person.name,orderby=order,\ groupby=db.person.name) >>> people=db().select(db.person.name,orderby=order,limitby=(0,100)) 一对多关系的例子
>>> tmp=db.define_table('dog', \ SQLField('name'), \ SQLField('birth','date'), \ SQLField('owner',db.person),\ migrate='test_dog.table') >>> dog_id=db.dog.insert(name='Snoopy',birth=None,owner=person_id) 简单JOIN(连接)
>>> rows=db(db.dog.owner==db.person.id).select() >>> for row in rows: print row.person.name,row.dog.name Max Snoopy 多对多关系的例子
>>> tmp=db.define_table('author',SQLField('name'),\ migrate='test_author.table') >>> tmp=db.define_table('paper',SQLField('title'),\ migrate='test_paper.table') >>> tmp=db.define_table('authorship',\ SQLField('author_id',db.author),\ SQLField('paper_id',db.paper),\ migrate='test_authorship.table') >>> aid=db.author.insert(name='Massimo') >>> pid=db.paper.insert(title='QCD') >>> tmp=db.authorship.insert(author_id=aid,paper_id=pid) SQLSet
>>> authored_papers=db((db.author.id==db.authorship.author_id)&\ (db.paper.id==db.authorship.paper_id)) >>> rows=authored_papers.select(db.author.name,db.paper.title) >>> for row in rows: print row.author.name, row.paper.title Massimo QCD 用belongs进行搜索
>>> set=(1,2,3) >>> rows=db(db.paper.id.belongs(set)).select(db.paper.ALL) >>> print rows[0].title QCD 嵌套选择
>>> nested_select=db()._select(db.authorship.paper_id) >>> rows=db(db.paper.id.belongs(nested_select)).select(db.paper.ALL) >>> print rows[0].title QCD 以CSV格式输出
>>> str(authored_papers.select(db.author.name,db.paper.title)) 'author.name,paper.title\r\nMassimo,
分享到:
相关推荐
Web2Py通过内部的长期优化,既追求更高的效率,也保持代码的简洁与精简,且保证了良好的向后兼容性。 Web2Py框架的免费使用,对于那些从中受益的个人或企业,鼓励以任何形式回报社会。在技术上,Web2Py体现了良好的...
8. **国际化与本地化**:Web2py支持多语言,可以轻松实现应用的国际化和本地化。 9. **模板引擎**:Web2py的模板语言简洁而强大,允许开发者使用Python语法来编写动态HTML,提高了开发效率。 10. **插件系统**:...
6. **国际化与本地化**:web2py支持多语言,可以轻松实现应用程序的国际化和本地化。 7. **错误处理和调试**:web2py提供了详细的错误报告和调试工具,帮助开发者快速定位并解决问题。 8. **部署简便**:由于web2...
与Ruby on Rails等其他流行框架相比,Web2py具有独特的特性,使其在众多框架中脱颖而出。 #### Web2py的特点 1. **Python编程语言**: - **简介**:Python是一种面向对象的编程语言,其设计旨在使学习过程尽可能...
10. **社区与文档**:Web2py有一个活跃的开发者社区,提供了丰富的文档和教程,方便新手入门和高级开发者深入研究。 压缩包中的"web2py"可能包含了Web2py框架的源代码、库文件、示例应用、文档等资源。开发者可以...
与Django等其他知名框架相比,Web2Py在易用性、灵活性以及对初学者的友好程度上有着独特的优势,因此被誉为Python Web框架中的新一代明星。 **1. Web2Py的核心特性** 1. **快速开发**: Web2Py提供了一个内置的集成...
6. **国际化与本地化**:web2py支持多语言应用,方便全球范围内的用户使用。 7. **调度器(Scheduler)**:web2py内建的调度器可以定期执行任务,例如定时发送邮件、数据同步等。 8. **部署简单**:由于web2py是...
8. **部署与扩展**:Web2Py可以轻松部署到各种服务器环境,如Apache、Nginx等,并支持WSGI协议。此外,Web2Py具有高度可扩展性,可以通过插件或模块来添加新的功能。 9. **学习资源**:Web2Py官方网站提供了详尽的...
10. **插件与扩展**:web2py社区提供了许多插件和扩展,如支付网关集成、报表生成、图表库等,丰富了web2py的功能。 11. **应用实例**:手册可能会包含实际应用案例,帮助读者理解如何利用web2py开发完整的Web应用...
**十二、web2py社区与资源** web2py有一个活跃的社区,提供了丰富的教程、示例应用和第三方库。官方文档、论坛、邮件列表等都是学习和交流的好去处。 总结,web2py_manual_v5官方文档详尽地介绍了web2py的各个方面...
5. **国际化与本地化**:Web2py 提供了强大的 I18N(国际化)和 L10N(本地化)支持,使你的应用能够轻松适应不同的语言和地区。 6. **内置开发服务器**:Web2py 自带了一个轻量级的开发服务器,便于在本地进行快速...
这些知识点为开发者提供了一个全面的框架来理解和开始使用web2py,并且能够正确地处理与版权、许可证和责任相关的法律事宜。通过阅读该文档,开发者可以有效利用web2py框架创建安全的web应用程序,并掌握Python语言...
**web2py框架详解** web2py是一款基于Python的全功能Web应用框架,它强调了易用性、安全性和高效性。web2py的核心设计理念是“编写即部署”,这意味着开发者可以快速地创建复杂的Web应用程序而无需额外的配置或...
2. **应用(Application)**:Web.py中的应用是一个Python对象,它包含所有路由和配置信息。创建一个基本的应用非常简单,如`app = web.application(urls, globals())`。 3. **处理器(Handlers)**:处理器是处理...
web.py 中文手册 webpy coobookweb.py 中文手册 webpy coobookweb.py 中文手册 webpy coobookweb.py 中文手册 webpy coobookweb.py 中文手册 webpy coobookweb.py 中文手册 webpy coobookweb.py 中文手册 webpy ...
这是一个web2py的入门教程。是一位教师翻译的。(正好我现在用python来做一个类似于CruiseControl的持续集成工具(我的是适用于C++项目),后台自动编译、自动部署,自动测试服务都搞好了,就缺Web展现层,正好发现...
用pycharm 直接加载本地的 web2py_src ,web2py_src.zip,The source code version works on all supported platforms, including Linux, but it requires Python 2.6, or 2.7 (recommended). It runs on Windows and ...
#### 二、web2py的核心特点与优势 ##### 2.1 原则 web2py的设计原则围绕着简化复杂性、提高开发效率以及确保安全性展开。它通过一系列内置工具和技术来实现这些目标,使得开发者可以专注于业务逻辑而不是技术细节。...
【标题】"py2+web.py.rar" 指的是一个使用Python 2版本和Web.py框架构建的Web应用程序的压缩文件。Web.py是Python语言中的一个轻量级Web开发框架,它允许开发者快速地创建功能丰富的Web服务。在Windows Server 2008 ...