1

注: Javascript または iframe は使用できません。実際、私はクライアント ブラウザが超基本的なことしかできないとは信じていません。

現在、私の研究のほとんどは Pylon のフレームワークに焦点を当てており、レガシー PHP4 アプリを MVC アプリケーションとして再構築しています。

私が遭遇した最初の奇妙な問題の 1 つと、過去に iframe を使用して解決した問題の 1 つは、JavaScript を使用して、典型的なコントローラーのインデックス ビューのダイジェスト ビューのような「ウィジェット」の動的コレクションを表示することです。

私の問題を視覚化する最良の方法は、Google のパーソナライズされたホームページを見ることです。彼らはJavascriptで問題を解決しますが、私のシナリオではjavascriptと基本的なXHTML以上のものはほとんど不可能です.

私が取り組み始めたアイデアの 1 つは、現在アクティブなウィジェットのデータベースまたはその他のサービスを 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__(現在、プロジェクトの名前空間にハードコードされています:()を介してコントローラーを動的にインポートします
  • 非常にコストがかかる可能性があります (ほとんどのウィジェット呼び出しはキャッシュできますが、そのうちの 1 つはユーザー パネルです)

これを行うには、より良い方法、またはおそらく WSGI または Pylons に既に実装されているメカニズムが必要だと思いますが、これまでのところ、私が見つけた最も近い方法は次のユーティリティメソッドです: http://www.pylonshq.com/ docs/en/0.9.7/modules/controllers_util/#pylons.controllers.util.forward ですNが、コレクション ビューを取得するためだけにpylonsの上に pylons のインスタンスを構築するのは少しクレイジーに思えます。

4

2 に答える 2

6

ほとんどの場合、最初に述べたことをお勧めしますが、Javascript を使用して各ウィジェットをロードしますが、それはオプションではないため、少し異なることを行う必要があると思います。

1 つのフロント コントローラーで必要なすべてのウィジェットを処理してビルドするというアプローチに加えて、Mako のテンプレートをより強力に使用することを検討することもできます。

小さなブロックを Mako def として実際に定義することができます。もちろん、これは完全な Python 機能を備えています。Mako テンプレートがドメイン ロジックで汚染されないようにするには、モデル内にすべてを保持し、必要に応じて Mako 定義内のモデル インスタンスを呼び出して、ページのコンポーネントがそれ自体を構築するようにしてください。

このアプローチの大きな利点は、Mako def がキャッシュ引数をサポートしているため、実際にページのコンポーネントに自分自身をキャッシュする方法を決定させることができることです。サイドバーは 5 分間キャッシュする必要があるかもしれませんが、たとえばトップ バーはヒットごとに変化します。また、コンポーネントが db ヒットをトリガーしているため、コンポーネントがそれ自体をキャッシュするときに db ヒットを保存します。

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 に答える