注意:不能使用Javascript或iframe.事实上,我不能相信客户端浏览器可以做任何事情,除了超基础.
我正在重建一个传统的PHP4应用程序作为MVC应用程序,我的大多数研究目前都集中在Pylon的框架上.
我遇到的第一个奇怪的问题之一是我过去通过使用iframe或更好的javascript来解决的问题是显示动态的"小部件"集合,就像典型控制器的索引视图的摘要视图一样.
可视化我的问题的最佳方式是查看Google的个性化主页.他们用Javascript解决了这个问题,但是对于我的场景,javascript和基本XHTML之上的任何东西都是不可能的.
我开始研究的一个想法是让我的Frontpage控制器为当前激活的小部件轮询数据库或其他服务,然后获取元组/ dicts列表,动态实例化每个控制器并构建渲染子视图的列表/字典并传递那个到首页视图,让它解决问题.
所以使用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.forward但是N
为了获得集合视图,在pylons之上构建pylons实例似乎有点疯狂.
虽然在大多数情况下我会推荐您最初声明的内容,使用Javascript加载每个小部件,因为这不是一个选项,我认为您需要做一些不同的事情.
除了尝试使用单个前端控制器的方法遍历所需的所有小部件并构建它们之外,您可能要考虑的另一种方法是在Mako中更有效地使用模板.
实际上,您可以将小块定义为Mako def,它当然具有完整的Python功能.为了避免使用域逻辑污染您的Mako模板,请确保在模型中保留所有模板,并根据需要调用Mako def中的模型实例以构建页面的该组件.
这种方法的一个巨大优势是,由于Mako def支持缓存args,您实际上可以让页面的组件决定如何自我缓存.也许边栏应该缓存5分钟,但顶部栏可以改变每个命中例如.此外,由于组件正在触发数据库命中,因此当组件自行缓存时,您将保存数据库命中.
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模板遍历小部件实例,并调用它们来渲染它们.