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

标签 python model-view-controller pylons cherrypy

注意:不能使用 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/

相关文章:

c# - 使用 byte[] 和 varbinary(max) 时图像在 NHibernate 中损坏或截断

sqlite - 使用 SqlAlchemy 和 Pylons 创建表失败

python - Pylons 重定向到 404 错误页面

python - VS Code 抛出错误 "Error while fetching extensions : XHR failed"

python - 为什么使用子进程时会出现 FileNotFoundError?

python - 如何通过多次重复系列来创建数据框?

python - 如何在 MongoKit 中获取排序结果?

python - 替换python中除N、n和空格之外的字符串中的所有元素

c# - MVC 5 中的数据注释

java - 当我尝试运行一个简单的 Spring 项目时出现错误