代码之家  ›  专栏  ›  技术社区  ›  David

多个控制器的一个视图(frontpage)(子视图)

  •  1
  • David  · 技术社区  · 16 年前

    笔记: 无法使用Javascript或iFrame。事实上,我不能相信客户端浏览器除了最基本的功能外还能做任何事情。

    我正在将传统的PHP4应用程序重建为MVC应用程序,目前我的大部分研究都集中在Pylon的框架上。

    我开始研究的一个想法是让我的Frontpage控制器为当前激活的小部件轮询数据库或其他服务,然后获取元组/目录列表,动态实例化每个控制器,构建渲染子视图的列表/目录,并将其传递给Frontpage视图,让它解决问题。

    因此,对于peusudo代码:

    Get request goes to WSGI
    WSGI calls pylons
    Pylons routes to Frontpage.index()
    Frontpage.index() 
       myViews = list()
       for WidgetController in ActiveWidegets():
            myViews.append(subRender(WidgetController, widgetView))
    
    c.subviews = myViews
    render(frontpage.mako)
    

    关于子渲染的奇怪之处

    • 通过以下方式动态导入控制器: __import__
    • 可能非常昂贵(大多数小部件调用都可以缓存,但其中一个是用户面板)

    我觉得必须有更好的方法,或者可能已经在WSGI或更好的挂架中实现了一种机制来实现这一点,但到目前为止,我发现的最接近的方法是这个实用方法: http://www.pylonshq.com/docs/en/0.9.7/modules/controllers_util/#pylons.controllers.util.forward 但建造起来似乎有点疯狂 N

    2 回复  |  直到 16 年前
        1
  •  6
  •   Ben Bangert    16 年前

    在大多数情况下,我会推荐您最初所说的,使用Javascript加载每个小部件,因为这不是一个选项,我认为您需要做一些稍微不同的事情。

    除了使用试图让一个前台控制器完成所有需要的小部件和建立它们的方法之外,你还需要考虑的另一个选择是在Mako更强有力地使用模板。

    实际上,您可以将小的块定义为makodef,它当然具有完全的Python功能。为了避免域逻辑污染Mako模板,请确保将所有这些都保留在模型中,并根据需要调用Mako def中的模型实例,以构建页面的组件。

    这种方法的一个巨大优势是,由于Mako def支持缓存参数,您实际上可以让页面的组件决定如何缓存它们自己。也许侧边栏应该被缓存5分钟,但是顶部的栏每次点击都会改变。此外,由于组件正在触发db命中,因此当组件缓存自身时,您将保存db命中。

    至于对您现有想法的一些调整,请确保不要为“小部件”实际使用挂架控制器,因为它们可以根据需要提供更多支持WSGI的功能,而构建小部件页面则不需要这些功能。

    我会考虑让所有的小部件都这样工作:

    class Widget(object):
        def process(self):
            # Determine if this widget should process a POST aimed at it
            # ie, one of the POST args is a widget id indicating the widget
            # to handle the POST
    
        def prepare(self):
            # Load data from the database if needed in prep for the render
    
        def render(self):
            # return the rendered content
    
        def __call__(self):
            self.process()
            self.prepare()
            return self.render()
    

    然后让主Mako模板迭代小部件实例,并调用它们来渲染它们。

        2
  •  0
  •   Chris Miles    16 年前

    ToscaWidgets 封装您的小部件,以及为每个用户启用的小部件的存储列表(如您所建议的,在数据库或其他服务中)。将已启用的ToscaWidgets列表传递给视图,这些widgets将呈现自己(包括在widget需要这些资源时向页面动态添加CSS/JavaScript引用)。