Web2py核心


命令行选项

我们已经学会了如何在上一章中使用GUI小部件来启动web2py服务器。

通过 从命令行 提示符启动服务器,可以跳过此小部件。

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

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

为了增加安全性,可以使用以下命令行 -

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

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

如果无意中删除了文件“ parameters_8000.py ”,或者由于其他原因,web2py中的基于Web的管理界面被禁用。

URL映射/调度

web2py的功能基于model-view-controller,它以特定的形式映射URL http://127.0.0.1:8000/a/d/f.html

直到控制器 d.py中 提到的函数 “f()” 位于名为“a”的应用程序之下。如果控制器不在应用程序中,则web2py使用名为 “default.py” 的默认控制器。

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

函数初始化

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

基于接受参数的函数传递请求,并向用户提供适当的输出。它是控制器,它根据用户的需要与应用程序的模型和视图进行交互以提供输出。

web2py - 工作流程

下面讨论web2py的工作流程

  • Web服务器在自己的线程中同时管理每个HTTP请求。

  • HTTP请求头被解析并传递给调度器。

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

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

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

  • 如果请求标头包含应用程序的会话cookie,则检索会话对象; 否则会创建一个会话ID。

  • 如果该操作以字符串的形式返回值,则返回给客户端。

  • 如果该操作返回一个可迭代对象,则该对象用于循环并将数据流传输到客户端。

条件模型

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

与任何其他MVC应用程序不同,web2py中的模型被视为有条件的。子文件夹中的模型根据控制器的使用情况执行。这可以用下面的例子来演示 -

考虑网址 - 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

web2py包含库,这些库可作为对象公开给所有应用程序。这些对象是在名为“gluon”的目录下的核心文件中定义的。

许多像DAL模板这样的模块都没有依赖关系,可以在web2py框架之外实现。它还维护被认为是良好实践的单元测试。

应用

下面以图表形式显示web2py应用程序。

图表形式

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

  • 模型 - 表示数据和数据库表。

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

  • 视图 - 帮助渲染数据的显示。

  • 语言 - 描述如何将应用程序中的字符串转换为各种支持的语言。

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

  • 关于自述文件 - 项目的详细信息。

  • 错误 - 存储应用程序生成的错误报告。

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

  • 数据库 - 存储SQLite数据库和附加表信息。

  • 缓存 - 存储缓存的应用程序项目。

  • 模块 - 模块是其他可选的Python模块。

  • 专用 - 包含文件由控制器访问,但不直接由开发人员访问。

  • 上传 - 文件由模型访问,但不直接由开发人员访问。

API

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

全局对象 - 请求,响应,会话,缓存。

助手 - web2py包含助手类,可用于编程构建HTML。 它对应于HTML标签,称为 HTML助手

例如,A,B,FIELDSET,FORM等

会议

会话可以被定义为服务器端的信息存储,它贯穿整个Web应用程序贯穿整个用户的交互。

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

例如,一个变量可以存储在session中

session.myvariable = "hello"

这个值可以被检索为

a = session.myvariable

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

web2py会话中的重要方法之一是 “忘记” -

session.forget(response);

它指示web2py不保存会话。

在后台运行任务

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

耗时的任务最好保存在后台。其中一些机制如下所列,它们管理后台任务 -

  • 科雷

  • 队列

  • 调度

科雷

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

调度

通过设置优先级,内置调度程序有助于在后台运行任务。它提供了创建,调度和修改任务的机制。

计划的事件在文件名为 “scheduler.py”的 模型中列出。

构建应用程序

我们概述了在web2py中创建模型和控制器。在这里,我们将重点介绍创建名为 “联系人” 的应用程序。应用程序需要保存公司列表以及在这些公司工作的人员列表。

模型的创建

这里,数据字典的表格的标识是模型。联系人应用程序的模型将在“ 模型 ”文件夹 下创建。该文件存储在 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\-\(\) ]+')),
   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/contacts/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())

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