gpt4 book ai didi

python - 许多 Controller ( subview )的一个 View (首页)

转载 作者:太空宇宙 更新时间:2023-11-04 08:23:35 25 4
gpt4 key购买 nike

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

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

我遇到的第一个奇怪问题之一,也是我过去使用 iframe 或更好的方法解决的一个问题,但 javascript 正在显示“小部件”的动态集合,就像典型 Controller 索引 View 的摘要 View .

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

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

因此使用伪代码:

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__ 动态导入 Controller (目前硬编码到项目的命名空间 :( )
  • 可能会非常昂贵(大多数小部件调用都可以缓存,但有一个是用户面板)

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

最佳答案

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

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

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

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

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

至于对您现有想法的一些调整,请确保不要实际将 Pylons Controller 用于“小部件”,因为它们会根据需要做更多的工作来支持 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 模板遍历小部件实例,并调用它们来渲染它们。

关于python - 许多 Controller ( subview )的一个 View (首页),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/574140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com