WEB2PY强迫开发者分开数据层(Model),显示层(View)以及控制器(Controller)。让我们再考虑一下之前的例子,看看怎么围绕该例子创建WEB2PY应用。
典型的WEB2PY中的用户请求处理过程如下:
如下是一个最简单的,包含三个文件,采用MVC架构的程序:
·“db.py”是数据层:
db = DAL('sqlite://storage.sqlite')
db.define_table('contacts',
Field('name'),
Field('phone'))
它负责数据库连接(在本例中,SQLite数据库存储于storage.sqlite文件中),还定义了一个名为contacts的表格。如果该表格在数据库中不存在,WEB2PY将会创建它,这一切都是在后台执行的,对于用户完全透明,WEB2PY对于不同的数据库引擎,能生成想应的SQL语句。开发者能够看到生成的SQL语句,但是无需修改数据库端的任何代码,默认的数据库是SQLite不过,用户能够改用MySQL、PostgreSQL、MSSQL、FireBird、Oracle、DB2、Informix或谷歌App Engine中的Big Table。
当表格定义好并创建好之后,WEB2PY还会生成功能齐全基于Web的数据库管理界面。该界面叫做appadmin,可以通过它访问数据库和表格。
·“default.py”是控制器:
def contacts():
return dict(records=db().select(db.contacts.ALL))
在WEB2PY中,URL地址被映射到Python组建或函数调用。在上面的例子中,控制器中包含一个叫做contacts的函数(行为)。该函数的返回值类型为字符串或Python字典(一组相互对应的索引和值)。当返回值类型为字典时,返回值将会被传递到一个和控制器或函数同名的视图,该视图负责渲染该字典。在上述例子中,名为contacts的从数据库中通过select选中并返回记录,返回值类型为索引和值相互对应的字典对象。
·“default/contacts.html”是视图:
{{extend 'layout.html'}}
<h1>Records</h1>
{{for record in records:}}
{{=record.name}}: {{=record.phone}}<br />
{{pass}}
在相对应的控制器(行为)执行后,上述视图将被WEB2PY自动调用。该视图用于把返回值字典中的记录渲染成为HTML。视图是用HTML语句编写的,不过其中内嵌的Python代码包含在,特殊字符{{和}}之间。这种方式同PHP代码有所不同,因为HTML内嵌的只有“表示层”代码。视图代码第一行所包含的“layout.html”文件,是由WEB2PY框架提供的,其中包含所有WEB2PY软件布局要用到的基本代码。该布局可以很很容易的被修改或替换。