Web2py - 核心

命令行选项

我们已经学习了如何使用上一章中的GUI小部件启动web2py服务器.

可以跳过此小部件从命令行提示启动服务器.

python web2py.py -a'您的密码'-i 127.0.0.1 -p 8000

每当web2py服务器启动时,它会创建一个文件" parameters_8000.py ",其中所有密码都以散列形式存储.

For为了额外的安全目的,可以使用以下命令行 :

python web2py.py -a '<recycle>' -i 127.0.0.1 -p 8000

对于上述情况,web2py重新使用存储在" parameters_8000.py "中的散列密码.

如果文件" parameters_8000.py "被意外删除或由于某些其他原因而被删除,则在web2py中禁用基于Web的管理界面.

URL映射/调度

功能正常web2py是基于模型 - 视图 - 控制器,它以特定的形式和减号映射URL; http://127.0.0.1:8000/a/d/f.html

它路由到函数"f()"控制器中提到的 d.py 位于名为"a"的应用程序下.如果应用程序中不存在控制器,则web2py使用名为"default.py"的默认控制器.

如果URL中给出的函数是如果不存在,则使用名为 init()的默认函数. URL的工作原理如下图所示.

Function Init

扩展程序 .html 对于URL是可选的.扩展名确定视图的扩展名,该扩展名呈现控制器中定义的函数的输出.相同的内容以多种格式提供,即html,xml,json,rss等.

请求根据函数传递,这些函数接受参数并将相应的输出提供给用户.它是控制器,它与应用程序的模型和视图交互,以根据用户的需要提供输出.

web2py  - 工作流程

web2py的工作流程将在下面讨论 :

  • Web服务器在其自己的线程中同时管理每个HTTP请求./p>

  • 解析HTTP请求标头并将其传递给调度程序.

  • Dispatcher管理应用程序请求并将 PATH_INFO 映射到函数调用的URL中.每个函数调用都在URL中表示.

  • 静态文件夹中包含的所有文件请求都是直接管理的,大文件将流式传输到客户端.

  • 除了静态文件之外的任何请求都会映射到一个动作.

  • 如果请求标头包含应用程序的会话cookie,检索会话对象;或者,创建会话ID.

  • 如果操作返回一个值为字符串,则返回给客户端.

  • 如果操作返回一个iterable,它将用于循环并将数据流传输到客户端.

条件模型

在上一章中,我们看到了控制器的功能. web2py在其每个应用程序中使用模型,视图和控制器.因此,还必须了解模型的功能.

与任何其他MVC应用程序不同,web2py中的模型被视为条件.子文件夹中的模型根据其控制器的用法执行.这可以通过以下示例 : 来证明;

考虑URL :   http://127.0.0.1:8000/a/d/f.html

在这种情况下,'a'是应用程序的名称,'d'是控制器的名称, f()是与控制器关联的功能.将执行的模型列表如下:<

applications/a/models/*.py
applications/a/models/d/*.py
applications/a/models/d/f/*.py

Libraries

web2py包含库,它们作为对象暴露给所有应用程序.这些对象在名为"gluon"的目录下的核心文件中定义.

许多模块(如DAL模板)没有依赖关系,可以在web2py的框架之外实现.它还维护单元测试,这被认为是良好的做法.

应用程序

web2py应用程序如下图所示.

图表形式

在web2py中开发的应用程序组成以下部分 :

  • 模型 : 表示数据和数据库表.

  • 控制器 : 描述应用程序逻辑和工作流程.

  • 视图 : 帮助呈现数据显示.

  • 语言 : 描述如何将应用程序中的字符串翻译成各种支持的语言.

  • 静态文件 : 不需要处理(例如图像,CSS样式表等).

  • 关于自述文件 : 号;项目详情.

  • 错误 : 存储应用程序生成的错误报告.

  • 会话 : 存储与每个特定用户相关的信息.

  • 数据库 : 存储SQLite数据库和其他表信息.

  • 缓存 : 存储缓存的应用程序项目.

  • 模块 : 模块是其他可选的Python模块.

  • 私有 : 包含的文件由控制器访问,但不是由开发人员直接访问.

  • 上传 : 文件由模型访问,但不是由开发人员直接访问.

API

在web2py中,模型控制器视图在为开发人员导入特定对象的环境中执行.

全局对象 : 请求,响应,会话,缓存.

助手 :  web2py包含帮助程序类,可用于以编程方式构建HTML.它对应于HTML标记,称为"HTML帮助程序".

例如,A,B,FIELDSET,FORM等.

会话

会话可以定义为信息的服务器端存储,它在整个Web应用程序的整个用户交互过程中保持不变.

web2py中的会话是存储类的实例.

例如,变量可以存储在会话中

 
 session.myvariable ="hello"

此值可以检索为

 
a = session.myvariable

只要代码在同一会话中执行,就可以检索变量的值同一个用户.

会话的web2py中的一个重要方法是"忘记" :

 
 session.forget(response);

它指示web2py不保存会话.

在后台运行任务

HTTP请求到达Web服务器,Web服务器并行处理其自己的线程中的每个请求.活动的任务在前台进行,而其他任务在后台进行.管理后台任务也是web2py的主要功能之一.

耗时的任务最好保留在后台.下面列出了一些机制,它们管理后台任务 :

  • CRON

  • 队列

  • 计划程序

CRON

在web2py中, CRON 给出了能够在指定的时间间隔内运行任务.每个应用程序都包含一个CRON文件,该文件定义了它的功能.

调度程序

内置调度程序通过设置来帮助在后台运行任务优先.它提供了一种创建,安排和修改任务的机制.

计划事件列在文件名为"scheduler.py"的模型中.

构建应用程序

我们概述了在web2py中创建模型和控制器.在这里,我们将专注于创建名为"Contacts"的应用程序.该应用程序需要维护公司列表,以及在这些公司工作的人员列表.

创建模型

在此,识别数据字典的表是模型.联系人应用程序的模型将在"模型"文件夹下创建.该文件存储在 models/db_contacts.py .

# in file: models/db_custom.py
db.define_table('company', Field('name', notnull = True, unique = True), format = '%(name)s')
db.define_table(
   'contact',
   Field('name', notnull = True),
   Field('company', 'reference company'),
   Field('picture', 'upload'),
   Field('email', requires = IS_EMAIL()),
   Field('phone_number', requires = IS_MATCH('[\d\-\(\) ]&plus;')),
   Field('address'),
   format = '%(name)s'
)

db.define_table(
   'log',
   Field('body', 'text', notnull = True),
   Field('posted_on', 'datetime'),
   Field('contact', 'reference contact')
)

创建上述文件后,可以借助URL http://127.0.0.1:8000/访问这些表格联系人/appadmin

创建控制器

控制器将包含一些用于列出,编辑和删除控制器的功能联系.

# in file: controllers/default.py
def index():return locals()
def companies():companies = db(db.company).select(orderby = db.company.name)
return locals()

def contacts():company = db.company(request.args(0)) or redirect(URL('companies'))
contacts = db(db.contact.company == company.id).select(orderby = db.contact.name)
return locals()

@auth.requires_login()
def company_create():form = crud.create(db.company, next = 'companies')
return locals()

@auth.requires_login()
def company_edit():company = db.company(request.args(0)) or redirect(URL('companies'))
form = crud.update(db.company, company, next='companies')
return locals()

@auth.requires_login()
def contact_create():db.contact.company.default = request.args(0)
form = crud.create(db.contact, next = 'companies')
return locals()

@auth.requires_login()
def contact_edit():contact = db.contact(request.args(0)) or redirect(URL('companies'))
form = crud.update(db.contact, contact, next = 'companies')
return locals()

def user():return dict(form = auth())

视图的创建及其输出将在下一章中讨论.