[PYTHON] web2py 开发框架介绍

web2py[web2py] 是一种免费的、开源的web开发框架,用于敏捷地开发安全的、数据库驱动的web应用;web2py采用Python[python] 语言编写,而且可使用Python编程。web2py是一个完整的堆栈框架,也就是说它包含了开发完整功能的web应用所需的全部组件。php

web2py被设计来指导web开发人员遵循良好的软件工程实践,如使用模型(Model)、视图(View)、控制器(Controller)(MVC)模式。web2py将数据表达(the model)从数据表示(the view)和应用逻辑及工做流(the controller)中分开。web2py提供的库能够帮助开发者分别设计、实施和测试MVC中的每一部分,并能使它们一块儿工做。html

web2py是为了安全而构建的。这意味着遵循成熟的方法,它能自动处理许多可能致使安全漏洞的问题。例如,web2py验证全部输入(防止注入攻击),转义全部输出(防止跨站点脚本攻击),重命名上传文件(防止目录遍历攻击)。在与安全有关的方面,web2py没有留给应用程序开发人员选择的余地。python

web2py中包含数据库抽象层(DAL),它可以动态写入SQL[sql:w] ,所以开发人员不须要本身写。DAL知道如何透明地生成支持SQLite[sqlite] ,MySQL[mysql] ,PostgreSQL[postgres] ,MSSQL[mssql] ,FireBird[firebird] , Oracle[oracle] ,IBM DB2[db2] ,Informix[informix] 以及Ingres[ingresdb] 的SQL语句。当在谷歌App Engine (GAE)[gae]上运行时,DAL也能生成函数调用Google Datastore。实验时,咱们支持更多的数据库。请查看web2py网站和邮件列表,获取最新的支持。一旦有一个或多个数据库表被定义,web2py也能生成一个全功能的基于web的数据库管理接口来访问数据库和表。mysql

web2py与其它web框架的不一样之处在于,它是惟一全面支持web2.0范例的框架,在这里web就是计算机。实际上,web2py不须要安装或配置,它能在任何支持Python的体系结构(Windows,,Windows CE,Mac OS X,iOS ,Unix/Linux)上运行,应用程序的开发、部署和维护能够经过本地或远程web接口完成。web2py支持CPython(C语言实现)或Jython(Java语言实现),虽然官方声称仅支持2.5版本,但实际支持的版本包括2.4,2.5,2.6,2.7,这保证了应用程序的后向兼容性。jquery

web2py提供了一个票据系统。若是出现错误,系统会发出一个票据给用户,并记录错误信息供管理员查看。web

web2py是开源的,在LGPL版本3许可证下发布。ajax

web2py的另外一个特色是开发者承诺在将来版本中保持后向兼容性。从2007年10月web2py首次发布至今,咱们一直都是这样作的。尽管web2py增长了新功能,修复了错误,然而若是一个程序在web2py1.0上能运行,那么它如今还能运行。算法

下面给出一些web2py语句的例子来展现它的功能和简洁性。代码以下:sql

1
db.define_table('person', Field('name'), Field('image', 'upload')) 

以上代码建立了一个“person”数据库表,该表包含两个字段,即”name”字符串和”image”, image是须要上传的图片(实际图片)。若是该表已经存在,可是与上述定义不匹配,则该表将会被妥善更改。shell

给定上述定义表,代码以下:

1
form = crud.create(db.person) 

建立了一个插入表单,该表容许用户上传图片。它还会验证提交的表单,以安全的方式重命名上传的图片,并将图片存储到文件中。同时,向数据库中插入相应记录,以防止重复提交。若是用户提交的数据未能经过验证,将经过添加错误信息来修改表单。

代码以下:

1
2
@auth.requires_permission('read','person') def f(): .... 

上述代码将阻止访问者进入函数f,除非访问者所在的组有权限读取”person”中的记录。若是访问者未登陆,他将被定向到登录页面(由web2py默认提供)。

下面的代码将嵌入页面组件:

1
{{=LOAD('other_controller','function.load',ajax=True, ajax_trap=True)}} 

上述代码指示web2py以视图形式加载其它控制函数生成的内容(适用于任何函数)。它经过Ajax加载内容,并将内容嵌入当前网页(使用当前布局而不是其它控制函数布局),这样就能捕获加载内容中的全部表单,这样不须要从新加载网页也能经过Ajax提交表单。它也能LOAD非web2py应用的内容。

LOAD帮助对象容许应用程序的模块化设计;本书最后一章将对此进行论述。

Python编程一般遵循如下基本原则:

  • 不重复本身(DRY)。
  • 仅有一种实现方式。
  • 明确比含蓄更好。

在web2py中,经过强制开发者使用可靠成熟的软件工程实践,遏制代码重复,保证彻底遵照前两条原则。web2py能指导开发者完成几乎全部web应用开发中的常见任务(建立和处理表单,管理会话,小甜饼“cookie”,错误等等)。

web2py对第3个原则的处理与其它框架有所不一样,有时与前两个原则相冲突。尤为是web2py不会导入用户应用,而是在预约义的状况下执行。这会暴露Python和web2py关键字。

对某些人来讲,这看起来就像魔术,但它不是这样的。简单地说,在实践中有些模块已经自动导入了,而不须要开发者导入。web2py试图避免其它框架下存在的使人讨厌的特征,即开发者须要在每一个模型和控制器的顶部导入相同的模块。

web2py经过导入自有模块节约了时间,避免了错误,这遵循了不重复本身和仅有一种实现方式的精髓。

若是开发者想使用其它Python模块或第三方模块,这些模块必须明确导入,就像开发任何其它Python程序同样。

 

 

在其最基本的层面上,web应用包含了一组程序(或者函数),当用户访问相应的URL时,该程序将被执行。同时,程序的输出返回给用户,并呈如今浏览器中。

web框架是为了让开发者更快、更简便、无差错的开发新应用。它经过提供API和开发工具,以减小代码编写量。

开发web应用的两个经典方法是:

  • 经过编程生成HTML[html:w,html:o] 代码。
  • 将代码嵌入HTML页面中。

早期的CGI脚本遵循第一种模型。下列脚本遵循第二种模型,例如PHP[php](代码用PHP编写,相似C语言)、ASP(代码用Visual Basic编写)以及JSP(代码用Java编写)脚本。

这里举一个PHP程序的例子,执行时,从数据库中得到数据,并返回一个显示选中记录的HTML页面。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<html><body><h1>Records</h1><? mysql_connect(localhost,username,password); @mysql_select_db(database) or die( "Unable to select database"); $query="SELECT * FROM contacts"; $result=mysql_query($query); mysql_close(); $i=0; while ($i < mysql_numrows($result)) { $name=mysql_result($result,$i,"name"); $phone=mysql_result($result,$i,"phone"); echo "<b>$name</b><br>Phone:$phone<br /><br /><hr /><br />"; $i++; } ?></body></html> 

这种方法的问题在于,程序代码嵌入到HTML中,可是这个程序在生成额外的HTML的同时,还要生成SQL语句查询数据库,应用的不一样层次交织在一块儿,代码变得难以阅读和难以维护。对于Ajax应用程序,状况就更糟了,随着应用页数(文件)的增长,复杂性也增长。

上述例子的功能,在web2py中可用两行Python代码来表达:

1
2
def index(): return HTML(BODY(H1('Records'), db().select(db.contacts.ALL))) 

在这个简单的例子中,页面结构由HTML,BODY和H1对象程序化表示;经过select语句查询数据库db;最后,全部结果都被序列化成HTML代码。注意db不是关键字,而是一个用户定义的变量。为了不混淆,咱们将始终使用db这一术语来指代数据库链接。

web框架一般分为两种类型:一种是“胶水”框架,经过组合(粘合)几个第三方组件来构造。另外一种是“全功能栈”框架,经过建立特别设计的紧密整合和协做工做的组件来构造。

web2py是一个全堆栈框架。几乎全部组件都是从头构建的,并被设计成协同工做,可是这些组件在web2py框架以外一样能发挥功能。例如,数据库抽象层(DAL)或模板语言都能独立于web2py框架使用,只要将gluon.dal或gluon.template导入你的Python应用便可。gluon是包含系统库的web2py模块的名称。一些web2py库依赖web2py的其它部分,例如,创建和处理来自数据库表格的表单。web2py也可以同第三方Python库配合使用,包括其它模板语言和DAL,但它们之间的结合没有原配组件那么紧密。

web2py鼓励开发人员将数据表达(Model)、数据表示(View)和应用工做流(Controller)分离。让咱们再考虑前面的例子,看看如何围绕该例创建一个web2py应用。下面是一个web2py MVC编辑界面的例子。

 

image

 

web2py中一个请求的典型工做流描述以下:

 

image

 

在图中:

  • 服务器能够是web2py内置服务器或第三方服务器,例如Apache。服务器能够处理多线程。
  • "main"是主要的WSGI应用。它负责处理全部常见任务和封装用户应用。它处理cookies、sessions、transactions、URL地址解析及反向地址解析和分发。若是web服务器没有处理的话,它能服务和流静态文件。
  • Model、View、Controller组件构成了用户应用。
  • 同一个web2py实例能够承载多个应用。
  • 虚线箭头表示与数据库引擎的通讯。数据库查询可使用SQL语言(不推荐)或使用web2py DAL语言(推荐),这样web2py应用代码不依赖于特定数据库引擎。
  • 分发器将请求的URL映射成控制器中的函数调用。函数的输出能够是字符串或符号字典(哈希表)。字典中的数据将被呈现成视图。若是用户请求HTML页面(默认状况),字典将被呈现成HTML页面。若是用户以XML请求同一页面,web2py将会尝试找到一个能将字典呈现成XML格式的视图。开发人员能够建立视图将页面呈现成任何已经支持的协议(HTML、XML、JSON、RSS、CSV、RTF)或者另外的自定义协议。
  • 全部的调用都被封装到一个事务(transaction)之中,而且任何未捕获到的异常都将致使事务回滚。若是请求成功,事务将被提交。
  • web2py还能自动处理sessions和session cookies,而且当事务被提交的时候,相应的session也被保存,除非有另有指明。
  • 还能注册常常性的任务(经过cron)以定时和/或在特定的任务完成(action)以后执行。用这种方式将可能在后台运行耗时长的、计算量大的任务,而不影响用户浏览。

这里给出一个最小的、完整的MVC应用,它由3个文件组成:

"db.py"是模型:
1
2
3
4
db = DAL('sqlite://storage.sqlite') db.define_table('contact', Field('name'), Field('phone')) 

它链接数据库(在本例中是指存储在storage.sqlite文件中的一个SQLite数据库),并定义了一个名为contact的表。若是该表不存在,web2py将在后台透明的建立它,并生成适用于特定数据库引擎的SQL语句。开发人员能够看到生成的SQL,若是用MySQL、PostgreSQL、MSSQL、FireBird、Oracle、DB二、Informix、Interbase、Ingres或谷歌App Engine(SQl和NoSQL)数据库代替默认数据库SQLite,就不须要修改数据库后台的代码。

当表格被定义并建立好以后,web2py还会生成一个功能完整的基于web的数据库管理界面,该界面称做appadmin,经过它访问数据库和表。

"default.py"是控制器:
1
2
3
def contacts(): grid=SQLFORM.grid(db.contact, user_signature=False) return locals() 

在web2py中,URL被映射成Python模块和函数调用。在本例中,控制器仅包含一个名为contacts的函数(或“action”)。Action可能返回字符串(返回的网页)或Python字典(一组对应的键和值)或一组局部变量(如同本例)。若是函数返回字典,它将被传送给视图,该视图与控制器/函数同名,并返回一个网页。在本例中,函数contacts 生成一个表db.contact的选择(select)/搜索(search)/建立(create)/更新(update)/删除(delete)网格,并将该网格返回给视图。

"default/contacts.html"是视图。
1
2
3
{{extend 'layout.html'}} <h1>Manage My Contacts</h1> {{=grid}} 

在相应的控制器函数(action)被执行后,web2py会自动调用视图。该视图的做用是将返回字典中的变量呈现成HTML。视图文件是用HTML语言编写的,并用分隔符{{and}}分隔嵌入的Python代码。这彻底不一样于PHP代码,由于嵌入到HTML中的码是“表示层”码。"layout.html"文件由web2py提供,并在视图文件的开始被引用,该文件构成了全部web2py应用的基本布局。该布局文件能够很容易地被修改或替换。

web2py是众多web应用框架中的一种,可是它有引人注目的、独特的功能。web2py最初被开发成一种教学工具,最初的开发动机以下:

  • 在不牺牲功能的前提下,方便用户学习服务器端web开发。为此,web2py被设计成无需安装、无需配置,无依赖性(除了源代码的发行版要求Python2.5和它的标准库模块外),绝大部分功能能够经过Web接口访问。
  • web2py从刚推出起一直到今天都保持稳定,由于它遵循自上而下的设计原则,即在它被编写之前全部编程接口(API)都已经被设计好。甚至加入了新功能,它的后向兼容性也不会被破坏。即使未来增长了新功能,也能实现兼容。
  • web2py前瞻性地解决许多重要的安全问题,这些问题困扰着许多现代Web应用,将在下面开放Web软件安全工程[owasp]中介绍。
  • web2py是轻量级的。其核心库,包括数据库抽象层、模板语言和全部帮助对象加在一块儿只有1.4MB。整个源代码包括示例应用和图像在内,也只有10.4MB。
  • web2py占用资源少,运行速度快。它使用由Timothy Farrell开发的Rocket[rocket] WSGI服务器。它与采用mod_wsgi的Apache同样快。咱们的测试代表,在一台普通的PC上,不访问数据库的动态网页平均响应时间大约10ms。DAL开销小,一般小于3%。
  • web2py在模块、控制器和视图中采用Python句法,但并不导入模块和控制器(其他Python框架采用导入方式),而是去执行它们。这意味着没必要重启web服务器便可进行应用的安装、卸载和修改,不一样的应用能够共存而不会致使模块的互相干扰。
  • web2py使用数据库抽象层取代对象关系映射(ORM)。从概念角度来讲,这意味着不一样的数据库表被映射成不一样的Table类实例,而不是不一样的类,同时记录被映射成Row类的实例,而不是相应的Table类的实例。从实用的角度来看,这意味着SQL句法与DAL句法几乎一一对应,DAL在引擎盖下没有复杂的元类(metaclass)编程,这与流行的ORM不一样,复杂的编程将增长延迟。

WSGI [wsgi-w,wsgi-o] (Web服务器网关接口)是一种新兴的Web服务器和Python应用之间通讯的Python标准。

下面是web2py主要管理(admin)界面的截图:

 

image

 

开放Web应用安全工程[owasp] (OWASP的)是一个自由和开放的全球社区,专一于改善应用软件的安全性。

OWASP列出了web应用安全方面的十大问题。在这里给出该列表,并陈述web2py是如何解决这些问题的:

  • “跨站点脚本攻击(XSS):当应用获取用户提交的数据并返回web浏览器时,若是不首先进行验证或编码,XSS漏洞就可能出现。XSS容许攻击者在受害者浏览器中执行脚本,从而劫持用户会话,毁损网站,还可能引入蠕虫。”在默认状况下,web2py将会转意呈如今视图中的全部变量,防止跨站点脚本攻击。
  • “注入攻击(Injection Flaws):注入攻击在Web应用中很是广泛,特别是SQL注入。当用户提交的数据被做为命令或查询的一部分发送到解释器时,注入攻击就可能发生。攻击者的恶意数据欺骗解释器执行异常的命令或更改数据。” web2py经过采用数据库抽象层使得SQL注入攻击不可能发生。一般状况下,SQL语句并非由开发人员编写的,而是由DAL动态生成的,从而确保全部插入的数据都被适当地转意。
  • “执行恶意文件”(Malicious File Execution):脆弱的远程文件包含的代码(RFI)可能被攻击者加入恶意代码和数据,形成毁灭性的攻击,例如服务器瘫痪。” web2py只容许运行对外暴露的函数,从而防止恶意文件的执行。导入的函数毫不会被暴露;暴露的仅有行为(action)。web2py采用了基于WEB的管理接口,使得很是容易跟踪暴露的行为。
  • “不安全的直接对象引用:(Insecure Direct Object Reference):当开发者把内部引用对象,例如文件、目录、数据库记录或密钥,做为URL地址或表单的参数时,不安全的直接对象引用攻击就可能发生。攻击者可以操控这些引用,在未经受权的状况下访问其它对象。” web2py没有暴露任何内部对象;此外,web2py还会验证全部的URL,从而防止目录遍历攻击。web2py还提供了一个使用简单的机制,以建立自动验证全部输入的表单。
  • “跨站点请求伪造(Cross Site Request Forgery):CSRF攻击迫使一个已经登陆的受害者的浏览器,向脆弱的网络应用发送一个预先验证的请求,该请求又迫使受害者的浏览器执行有利于攻击者的敌意行为。web应用有多强大,CSRF就有多强大。” web2py经过在表单中加入一次性随机令牌,防止CSRF攻击和偶然的表单重复提交。另外web2py对会话cookie使用了UUID。
  • “信息泄露和错误处理不当(Information Leakage and Improper Error Handling):应用可能无心中泄露它们的配置、内部运做的信息,或者在各类应用中侵犯隐私。攻击者能够经过该缺陷窃取得到敏感数据或发起更严重的攻击。” web2py中包含一个票据系统。任何错误都不会致使代码暴露给用户。全部的错误都被记录,框架会发送一个票据给用户,用来进行错误追踪。只有系统管理员才能访问错误和源代码。
  • “验证和会话管理中断(Broken Authentication and Session Management):用户帐户信息和会话令牌经常没有被妥善加以保护。攻击者经过获取用户密码、密钥或者验证令牌冒用其它用户的身份。” web2py提供了内置的管理员验证机制,它能为每个应用独立地管理会话。当客户端不是"localhost"时,管理接口也可以强制使用安全的会话cookie。对于应用来讲,web2py框架提供了功能强大的基于角色的接入控制API。
  • “不安全加密存储(Insecure Cryptographic Storage):Web应用程序不多使用合理的加密算法保护数据和凭证。攻击者利用加密不足的数据进行身份盗用和其它犯罪,例如信用卡诈骗。” web2py使用MD5或HMAC+SHA-512哈希算法来保护用户存储的密码。固然,也能够采用其它算法。
  • “不安全通讯(Insecure Communications):当须要保护敏感通讯时,应用经常不能加密网络数据流。” web2py包含支持SSL[ssl]的Rocket WSGI 服务器,它也能使用Apache或Lighttpd和mod─ssl进行通讯SSL加密。
  • “未能限制URL访问”(Failure to Restrict URL Access):应用常常仅仅经过不显示敏感的连接或URL来阻止未受权用户,以保护敏感功能。攻击者正是利用这一漏洞,经过直接接入这些URL来进行未受权的操做。” web2py将URL请求映射到Python模块和函数。web2py包含了一套验证机制,能够定义那些函数是公有的,那些是须要通过验证和受权才能访问的。基于角色的接入控制API容许开发者采用登陆、会员群或接入许可群来限制访问函数。权限是能够细化的,例如,经过结合CRUD可以让用户接入指定的表和/或记录。基于登陆或组群权限来限制用户的访问。例如,,权限的设置甚至可以细化到哪些用户可以访问哪些表和记录。web2py还支持数字签名的URL,而且提供了API对ajax回调进行数字签名。

对web2py的安全性评论,你能够在参考文献 [pythonsecurity]中找到评论性结果。

你能够经过官方网站下载web2py:

1
http://www.web2py.com 

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的总体结构:

 

 

image

 

下载方法:

web2py:官网http://www.web2py.com/ 

选择你的系统

 

下载完成后使用方法:

1.打开你的pycharm:关闭当前project

2.open你下载好的web2py的源文件:点击运行web2python->web2py framework 就出来了 选择服务器的 ip port 及设置密码->而后就能够点击 start sever啦!

3.而后就能够开始发挥你的想象了:

 

 还能够添加你的一些功能,发挥你的想象吧!

 

注:上面部分介绍来自官方

相关文章
相关标签/搜索