Frage

Weitere Informationen: Kann nicht Javascript oder iFrames verwenden. In der Tat kann ich nicht den Client-Browser vertrauen nur um alles andere als ultraGrundLagen zu tun.

Ich bin Wiederaufbau ein Vermächtnis PHP4 App als MVC-Anwendung, mit den meisten meiner Forschung derzeit mit dem Pylon des Rahmens konzentriert.

Eines der ersten seltsamen Fragen, die ich habe laufen in und ein ich in der Vergangenheit gelöst haben von Iframes oder besser noch mit Hilfe von JavaScript eine dynamische Sammlung von „Widgets“ anzeigt, die verdauen sind wie Indexansicht Ansichten eines typischen Controller .

Der beste Weg, um mein Problem zu visualisieren wäre bei Google die personalisierte Startseite zu suchen. Sie lösen das Problem mit Javascript, aber für mein Szenario javascript und so ziemlich alles über grundlegende XHTML ist nicht möglich.

Eine Idee, die ich zu arbeiten begann, war zu meiner Startseite Controller Umfrage eine Datenbank oder ein anderen Dienst für die derzeit aktiven Widgets hat, dann eine Liste von Tupeln / dicts nehmen, dynamisch jeden Controller instanziiert und eine Liste / dict bauen Unterputz Ansichten und dass auf der Startseite Ansicht passieren und lassen sie es Dinge herauszufinden.

So mit peusudo Code:

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)

Schräge Bits über Subrender

  • Dynamisch-Steuerungen über __import__ importiert (derzeit Projektnamespace fest einprogrammiert :()
  • Hat ein Potenzial, sehr teuer (die meisten Widget Anrufe können zwischengespeichert werden, aber man ist ein Bedienpanel)

Ich fühle mich wie es eine bessere Art und Weise oder vielleicht einen Mechanismus bereits umgesetzt in WSGI oder besser noch Pylons sein, dies zu tun, aber so weit in der Nähe ich gefunden habe, ist diese Dienstprogramm Methode: http://www.pylonshq.com/docs/en/ 0.9.7 / modules / controllers_util / # pylons.controllers.util.forward aber es scheint ein wenig verrückt N Instanzen von Pylonen auf den Masten zu bauen nur eine Sammlung Ansichten zu erhalten.

War es hilfreich?

Lösung

Während in den meisten Fällen würde ich empfehlen, was Sie ursprünglich angegeben, mit Javascript jedes Widget zu laden, da das keine Option ist glaube ich Sie ein wenig etwas anderes tun müssen.

Neben der Verwendung der Annäherung versuchen, ein einzelner Front-Controller haben alle Widgets benötigt gehen und bauen sie eine Alternative Sie vielleicht zu prüfen, macht stärkere Nutzung des Templating in Mako.

Sie können tatsächlich kleine Blöcke als Mako def die definieren, was natürlich voll Python Macht haben. verschmutzen Ihre Mako-Vorlagen mit Domain-Logik zu vermeiden, stellen Sie sicher in Ihren Modellen, dass alle zu halten, und nur Anrufe in der Mako def ist auf die Modellinstanzen zu machen, wie für die jeweilige Komponente der Seite benötigt selbst zu bauen.

Ein großer Vorteil dieses Ansatzes besteht darin, dass, da Mako def Unterstützung Cache args, können Sie tatsächlich Komponenten der Seite haben entscheiden, wie sie sich cachen. Vielleicht sollte die Sidebar für 5 Minuten im Cache gespeichert werden, aber die obere Leiste ändert sich bei jedem Treffer zum Beispiel. Da auch die Komponente des db Hit auslöst, werden Sie db Treffer speichern, wenn die Komponente selbst zwischenspeichert.

ToscaWidgets nicht die Leistung muss es eine sehr machbare Option in einem größeren Maßstab zu machen, also würde ich bleiben weg, dass von dem Versuch, aus.

Wie für einige kleine Änderungen an Ihrer bestehenden Idee, stellen Sie sicher nicht, um tatsächlich Pylons Controller für ‚Widgets‘ zu verwenden, da sie viel mehr tun als nötig WSGI zu unterstützen, die Sie nicht brauchen, um eine Seite nach oben von Widgets für den Bau.

Ich halte würde alle Widget-Klassen arbeiten zu müssen etwa so:

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()

Dann nur Ihr Haupt Mako-Vorlage durch die Widget-Instanzen durchlaufen, und nennen sie sie rendern.

Andere Tipps

könnten Sie ToscaWidgets Ihre Widgets verkapseln, zusammen mit einer gespeicherten Liste der Widgets für jeden Benutzer aktiviert ( in Datenbank oder einer anderen Dienstleistung, wie Sie vorschlagen). Führen Sie eine Liste der aktivierten ToscaWidgets zur Ansicht und die Widgets machen wird selbst (einschließlich dynamisch Hinzufügen von CSS / JavaScript Verweise auf die Seite, wenn Widget diese Ressourcen erfordert).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top