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


1

备注:无法使用Javascript或iframe。事实上,我不能相信客户端浏览器只是基于超级基础来做任何事情。

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

我遇到的第一个奇怪问题之一,我已经通过使用iframe或更好的解决了过去的问题javascript显示了一个动态的“小部件”集合,就像典型控制器索引的摘要视图视图。

想象我的问题的最佳方式是查看Google的个性化主页。他们用Javascript解决了这个问题,但对于我的场景来说,JavaScript和几乎所有基本的XHTML都是不可能的。

我开始研究的一个想法是让我的Frontpage控制器为当前激活的小部件轮询数据库或其他服务,然后获取元组/列表的列表,动态实例化每个控制器并构建render子列表/字典 - 浏览并将其传递给FrontPage视图,并让它找出结果。

因此,与peusudo代码:约subRender

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中实现的机制,或者更好的是Pylons做到这一点,但到目前为止,我发现最接近的是这种实用方法:http://www.pylonshq.com/docs/en/0.9.7/modules/controllers_util/#pylons.controllers.util.forward,但它似乎有点疯狂在塔架顶部建立N塔架实例以获得集合视图。

  0

@S。洛特谢谢,当我第一次提交时,没有意识到它造成了严重的后果。 22 2月. 092009-02-22 03:33:02

6

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

除了使用尝试让单个前端控制器遍历所需的所有小部件并构建它们的方法之外,您可能想要考虑的另一种方法是更有效地使用Mako中的模板。

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

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

ToscaWidgets不具备使其成为大规模非常可行的选项的性能,所以我会远离尝试。

至于对现有想法的一些调整,请务必不要实际使用Pylons控制器来处理'小部件',因为他们需要做更多的事情来支持WSGI,而您不需要为构建页面部件而构建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的模板迭代通过控件实例,并给他们打电话来呈现出来。


0

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

  0

@Chris - 我最近才开始研究Tosca,我的印象是它更像一个表单生成工具,或者我误会了吗? 17 3月. 092009-03-17 16:33:37

  0

@David - 不,它不是特定的表单,虽然它在tw.forms中提供了很多基于窗体的小部件。 TW本身是一个“Widget”封装库,可以封装任何可重用的UI组件。文档可能不会很明显。 01 4月. 092009-04-01 00:14:31