1

注意:不能使用 Javascript 或 iframe。事实上,我不能相信客户端浏览器可以做任何事情,除了超基础。

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

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

可视化我的问题的最佳方法是查看 Google 的个性化主页。他们用 Javascript 解决了这个问题,但是对于我的场景来说,javascript 和几乎任何高于基本 XHTML 的东西都是不可能的。

我开始研究的一个想法是让我的 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)

关于 subRender 的奇怪之处

  • __import__通过(当前硬编码到项目的命名空间:()动态导入控制器
  • 有可能非常昂贵(大多数小部件调用可以被缓存,但一个是用户面板)

我觉得必须有一种更好的方法,或者可能已经在 WSGI 或更好的 Pylons 中实现了一种机制来做到这一点,但到目前为止,我发现的最接近的是这个实用方法: http: //www.pylonshq.com/ docs/en/0.9.7/modules/controllers_util/#pylons.controllers.util.forwardN但在 pylons 之上构建 pylons实例只是为了获得集合视图似乎有点疯狂。

4

2 回答 2

6

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

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

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

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

ToscaWidgets 没有性能使其成为更大规模的非常可行的选择,所以我不会尝试它。

至于对您现有想法的一些调整,请确保实际上不要将 Pylons 控制器用于“小部件”,因为它们在支持 WSGI 时需要做更多工作,而您不需要构建小部件页面。

我会考虑让所有 Widget 类都像这样工作:

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 模板遍历小部件实例,并调用它们来渲染它们。

于 2009-04-24T04:08:31.680 回答
0

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

于 2009-03-16T07:03:57.870 回答