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 ”被意外删除或由于某些其他原因,基于 web 的管理界面在 web2py 中被禁用。
  • URL 映射/调度

    web2py 的功能基于模型-视图-控制器,它以特定形式映射 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 请求标头被解析并传递给调度程序。
    • Dispatcher 管理应用程序请求并将PATH_INFO映射到函数调用的 URL 中。每个函数调用都在 URL 中表示。
    • 所有对静态文件夹中文件的请求都直接管理,大文件流式传输到客户端。
    • 除了静态文件之外的任何请求都被映射到一个动作中。
    • 如果请求标头包含应用程序的会话 cookie,则检索会话对象;否则,将创建一个会话 ID。
    • 如果操作返回字符串形式的值,则将其返回给客户端。
    • 如果该操作返回一个可迭代对象,则它用于循环并将数据流式传输到客户端。
  • 条件模型

    在上一章中,我们看到了控制器的功能。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 模块。
    • Private - 包含的文件由控制器访问,但开发人员不能直接访问。
    • 上传- 文件由模型访问,但开发人员不直接访问。
  • 应用程序接口

    在 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 服务器,它在自己的线程中并行处理每个请求。活动任务在前台进行,而其他任务则保留在后台。管理后台任务也是 web2py 的主要功能之一。
    耗时的任务最好放在后台。下面列出了一些机制,它们管理后台任务 -
    • CRON
    • Queues
    • Scheduler

    定时任务

    在 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())
    
    视图的创建及其输出将在下一章中讨论。