📜  Web2py-核心

📅  最后修改于: 2020-10-17 05:17:41             🧑  作者: Mango


命令行选项

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

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

Python web2py.py -a’您的密码’-i 127.0.0.1 -p 8000

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

为了提高安全性,可以使用以下命令行-

python web2py.py -a '' -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的工作原理如下图所示。

功能初始化

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

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

web2py –工作流程

下面讨论了web2py的工作流程-

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

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

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

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

  • 对除静态文件以外的任何内容的请求都映射到一个动作中。

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

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

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

条件模型

在上一章中,我们了解了Controllers的功能。 web2py在每个应用程序中使用模型,视图和控制器。因此,也有必要了解Model的功能。

与任何其他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中开发的应用程序由以下部分组成-

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

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

  • 视图-帮助呈现数据的显示。

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

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

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

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

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

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

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

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

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

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

API

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

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

Helpers -web2py包含helper类,可用于以编程方式构建HTML。它对应于HTML标记,称为“ HTML助手”

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

届会

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

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

例如,可以将变量存储为

session.myvariable = "hello"

该值可以检索为

a = session.myvariable

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

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

session.forget(response);

它指示web2py不保存会话。

在后台运行任务

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

耗时的任务最好保留在后台。下面列出了一些机制,这些机制管理后台任务-

  • 克朗

  • Queue列

  • 排程器

克朗

在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\-\(\) ]+')),
   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())

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