Web2py - 组件

  • 简述

    组件被定义为网页的功能部分,它可以自主工作。它可以由嵌入在网页中的模块、控制器和视图组成。应用程序中的组件必须是本地化标签,并且性能被认为是独立于模块的。
    在 web2py 中,主要关注于使用加载到页面中的组件,这些组件通过 AJAX 与组件控制器通信。
    web2py 包含一个称为LOAD函数的函数,它使组件的实现变得容易,而无需显式的 JavaScript 或 AJAX 编程。
    考虑一个简单的 Web 应用程序,即“ test ”,它使用文件“ models/db_comments.py ”中的自定义模型扩展 web2py 应用程序。
    
    db.define_table(
       'comment_post', Field('body','text',
       label = 'Your comment'),auth.signature
    )
    
    上面的代码将使用正确的表定义创建一个表“ comment_post ”。该动作将借助“ controllers/comments.py ”中的函数来实现。
    
    def post():
       return dict(
          form = SQLFORM(db.comment_post).process(),
          comments = db(db.comment_post).select()
       )
    
    相应的视图将显示为 -
    
    {{extend 'layout.html'}}
    {{for post in comments:}}
    <div class = "post">
       On {{= post.created_on}} {{= post.created_by.first_name}}
       says <span class = "post_body">{{= post.body}}</span>
    </div>
    {{pass}}
    {{= form}}
    
    可以使用给定的 URL 访问该页面 - http://127.0.0.1:8000/test/comments/post
    上面提到的方法是访问视图的传统方式,可以随着 LOAD 函数的实现而改变。
    这可以通过创建一个不扩展布局的扩展名为“.load”的新视图来实现。
    创建的新视图将是“views/comments/post.load” -
    
    <div class = "post">
       On {{= post.created_on}} {{= post.created_by.first_name}}
       says <blockquote class = "post_body">{{= post.body}}</blockquote>
    </div>
    {{pass}}
    {{= form}}
    
    访问该页面的 URL 为 - http://127.0.0.1:8000/test/comments/post.load
    LOAD 组件可以嵌入到 web2py 应用程序的任何其他页面中。这可以通过使用以下语句来完成。
    
    {{= LOAD('comments','post.load',ajax = True)}}
    
    例如,控制器可以编辑为 -
    
    def index():
       return dict()
    
    View中,我们可以添加组件 -
    
    {{extend 'layout.html'}}
    {{= LOAD('comments','post.load',ajax = True)}}
    
    可以使用 URL 访问该页面 - http://127.0.0.1:8000/test/default/index
  • 组件插件

    组件插件是唯一定义组件的插件。组件使用它们的模型定义直接访问数据库。
    正如在前面的例子中提到的,comments_plugin 中的评论组件可以模型部分完成 -
    models/plugin_comments.py ” -
    
    db.define_table(
       'plugin_comments_comment',
       Field('body','text', label = 'Your comment'),
       auth.signature
    )
    
    控制器将包括以下插件 -
    
    def plugin_comments():
       return LOAD('plugin_comments','post',ajax = True)