Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多个控制器的一个视图(frontpage)(子视图)_Python_Model View Controller_Pylons_Cherrypy - Fatal编程技术网

Python 多个控制器的一个视图(frontpage)(子视图)

Python 多个控制器的一个视图(frontpage)(子视图),python,model-view-controller,pylons,cherrypy,Python,Model View Controller,Pylons,Cherrypy,注意:不能使用Javascript或iFrame。事实上,我不能相信客户端浏览器除了最基本的功能外还能做任何事情 我正在将传统的PHP4应用程序重建为MVC应用程序,目前我的大部分研究都集中在Pylon的框架上 我遇到的第一个奇怪的问题之一,也是我过去通过使用iframes或更好的javascript解决的问题之一,就是显示一个“小部件”的动态集合,类似于典型控制器索引视图的摘要视图 将我的问题形象化的最好方法是查看谷歌的个性化主页。他们用Javascript解决了这个问题,但对于我的场景来说,

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

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

我遇到的第一个奇怪的问题之一,也是我过去通过使用iframes或更好的javascript解决的问题之一,就是显示一个“小部件”的动态集合,类似于典型控制器索引视图的摘要视图

将我的问题形象化的最好方法是查看谷歌的个性化主页。他们用Javascript解决了这个问题,但对于我的场景来说,Javascript和基本XHTML之上的任何东西都是不可能的

我开始研究的一个想法是让我的Frontpage控制器为当前激活的小部件轮询数据库或其他服务,然后获取元组/目录列表,动态实例化每个控制器,构建渲染子视图的列表/目录,并将其传递给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)
关于子渲染的奇怪之处

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

我觉得必须有一种更好的方法或者WSGI中已经实现的机制或者更好的挂架来实现这一点,但到目前为止,我发现最接近的方法是这个实用方法:但是在挂架上构建挂架的
N
实例只是为了获得一个集合视图似乎有点疯狂。

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

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

在大多数情况下,我建议您使用您最初所说的方法,使用JavaScript加载每个小部件,因为这不是一个选项,我想您需要做一些不同的事情

除了使用试图让一个前台控制器完成所有需要的小部件和建立它们的方法之外,你还需要考虑的另一个选择是在Mako上更强有力地使用模板。 实际上,您可以将小块定义为Mako def,这当然具有完全的Python功能。为了避免域逻辑污染Mako模板,请确保将所有这些都保留在您的模型中,并根据需要调用Mako def中的模型实例,以构建页面的该组件

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

ToscaWidgets的性能不足以让它在更大范围内成为一个非常可行的选项,所以我不想尝试

至于对您现有想法的一些调整,请确保不要为“小部件”实际使用挂架控制器,因为它们可以根据需要提供更多支持WSGI的功能,而构建小部件页面则不需要这些功能

我会考虑让所有的小部件都这样工作:< /P>
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模板迭代小部件实例,并调用它们来呈现它们。

在大多数情况下,我建议您使用您最初所述的方法,使用Javascript加载每个小部件,因为这不是一个选项,我认为您需要做一些稍微不同的事情

除了使用试图让一个前台控制器完成所有需要的小部件和建立它们的方法之外,你还需要考虑的另一个选择是在Mako上更强有力地使用模板。 实际上,您可以将小块定义为Mako def,这当然具有完全的Python功能。为了避免域逻辑污染Mako模板,请确保将所有这些都保留在您的模型中,并根据需要调用Mako def中的模型实例,以构建页面的该组件

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

ToscaWidgets的性能不足以让它在更大范围内成为一个非常可行的选项,所以我不想尝试

至于对您现有想法的一些调整,请确保不要为“小部件”实际使用挂架控制器,因为它们可以根据需要提供更多支持WSGI的功能,而构建小部件页面则不需要这些功能

我会考虑让所有的小部件都这样工作:< /P>
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模板遍历小部件实例,并调用它们进行渲染。

@S.洛特谢谢,我第一次提交时没有意识到它渲染得那么糟糕。@S.洛特谢谢,我第一次提交时没有意识到它渲染得那么糟糕。@Chris-我最近开始研究托斯卡,事实上,我在给人的印象是,它更像是一个表单生成器