Web2py 核心

Web2py 核心

命令行选项

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

可以通过从 命令行提示符 开始服务器来跳过此小部件。

python web2py.py -a ‘your password’ -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的工作原理是基于模型-视图-控制器,它将URL映射为特定形式的地址“ http://127.0.0.1:8000/a/d/f.html ”。

它会路由到控制器 d.py 中的函数 “f()” ,该控制器位于名为“a”的应用程序之下。如果应用程序中不存在该控制器,则web2py会使用一个默认控制器 “default.py”

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

Web2py 核心

扩展名 .html 在URL中是可选的。扩展名决定了 View 的扩展名,该视图呈现控制器中定义的函数的输出。同样的内容以多种格式提供,包括html、xml、json、rss等。

根据接收参数并向用户提供适当输出的函数来传递请求。它是与模型和视图交互以根据用户需求提供输出的控制器。

web2py – 工作流程

web2py的工作流程如下所述 –

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

  • 解析HTTP请求头并传递给调度程序。

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

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

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

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

  • 如果动作返回一个字符串值,则将其返回给客户端。

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

条件模型

在上一章中,我们看到了 控制器 的功能。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

web2py包括库,这些库以对象形式对所有应用程序进行公开。这些对象定义在名为“gluon”的目录下的核心文件中。

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

应用程序

以下以图解形式显示了web2py应用程序。

Web2py 核心

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

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

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

  • 视图 - 用于渲染数据的显示。

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

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

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

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

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

  • 数据库 - 存储SQLite数据库和其他表信息。

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

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

  • 私有 - 控制器可以访问的文件,但开发人员不能直接访问。

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

API

在web2py中, 模型控制器视图 在一个导入了某些对象的环境中执行,供开发者使用。

全局对象 - request、response、session、cache。

辅助函数 - web2py包括辅助类,可用于以编程方式构建HTML。它对应于HTML标签,被称为“HTML助手”。

例如:A、B、FIELDSET、FORM等。

会话

会话可以被定义为服务器端存储的信息,它在用户与Web应用程序的交互中持续保存。

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

例如,一个变量可以存储在会话中,如下所示:

session.myvariable = "hello"

这个值可以被获取为

a = session.myvariable

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

session中的一个重要方法是 “forget”

session.forget(response);

它告诉web2py不保存会话。

在后台运行任务

一个HTTP请求到达web服务器,它会在自己的线程中并行地处理每个请求。活动中的任务在前台执行,而其他任务则在后台保持。管理后台任务也是web2py的主要特性之一。

耗时的任务最好保持在后台。以下是一些管理后台任务的机制:

  • CRON

  • 队列

  • 调度器

CRON

在web2py中, CRON 可以在指定时间间隔内运行任务。每个应用程序都包含一个CRON文件,用于定义其功能。

调度器

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

调度的事件列表在模型中列出,文件名为 “scheduler.py”

构建应用程序

我们已经概述了在web2py中创建模型和控制器的过程。这里,我们将专注于创建名为 “联系人” 的应用程序。该应用程序需要维护一个公司列表和在这些公司工作的人员列表。

创建模型

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

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程