- Web2py 教程
- Web2py - 首页
- Web2py - 简介
- Web2py - Python 语言
- Web2py - 框架概述
- Web2py - 核心
- Web2py - 视图
- Web2py - 数据库抽象层
- Web2py - 表单 & 验证器
- Web2py - 邮件 & 短信
- Web2py - 访问控制
- Web2py - 服务
- Web2py - 添加 Ajax 效果
- Web2py - 组件
- Web2py - 部署
- Web2py - 安全性
- Web2py 有用资源
- Web2py - 快速指南
- Web2py - 有用资源
- Web2py - 讨论
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 的功能基于模型-视图-控制器,它将 URL 映射到特定形式:http://127.0.0.1:8000/a/d/f.html
它路由到名为“a”的应用程序中控制器d.py中提到的函数“f()”。如果应用程序中不存在该控制器,则 web2py 使用名为“default.py”的默认控制器。
如果 URL 中指定的函数不存在,则使用名为init()的默认函数。URL 的工作原理如下图所示。
URL 的扩展名.html是可选的。扩展名决定了呈现控制器中定义的函数输出的视图的扩展名。相同的内容以多种格式提供,例如 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 中开发的应用程序由以下部分组成:
模型 - 表示数据和数据库表。
控制器 - 描述应用程序逻辑和工作流程。
视图 - 帮助呈现数据的显示。
语言 - 描述如何将应用程序中的字符串翻译成各种支持的语言。
静态文件 - 不需要处理(例如图像、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
只要由同一用户在同一会话中执行代码,就可以检索变量的值。
web2py 中用于会话的重要方法之一是“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') )
创建上述文件后,可以使用 URLhttp://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())
将在下一章讨论视图及其输出的创建。