Один вид (передняя страница) для многих контроллеров (подменю)


1

Примечания: Невозможно использовать Javascript или iframes. На самом деле я не могу доверять браузеру клиента, чтобы сделать что-то, кроме ультрасовременных.

Я перестраиваю устаревшее приложение PHP4 как приложение MVC, причем большинство моих исследований в настоящее время сосредоточено на структуре Pylon.

Одна из первых странных проблем, с которыми я столкнулся, и один, который я решил в прошлом, используя iframes или еще лучше, но javascript отображает динамическую коллекцию «виджетов», которые похожи на дайджест-представления типичного индекса контроллера Посмотреть.

Лучший способ визуализации моей проблемы - посмотреть на персонализированную домашнюю страницу Google. Они решают проблему с Javascript, но для моего сценария javascript и почти ничего выше базового XHTML невозможно.

Одна из идей, над которыми я начал работать, заключалась в том, чтобы мой контролер Frontpage опросил базу данных или другую службу для активированных в данный момент виджетов, затем, взяв список кортежей/диктов, динамически создавал экземпляр каждого контроллера и создавал список/-views и передать это на вид спереди и дать понять, что происходит.

Так с кодом 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) 

Weird бит около subRender

  • Динамически импортирует контроллеры через __import__ (в настоящее время HARDCODED пространство имен проекта :()
  • имеет потенциал, чтобы быть очень дорогим (большинство вызовов виджетов можно кэшировать, но один из них - панель пользователя)

Я чувствую, что должен быть лучший способ или, возможно, механизм, уже реализованный в WSGI или еще лучше, чем Pylons, чтобы сделать это, но до сих пор самым близким я нашел этот полезный метод: http://www.pylonshq.com/docs/en/0.9.7/modules/controllers_util/#pylons.controllers.util.forward, но кажется немного сумасшедшим построить N экземпляров пилонов на вершине пилонов, чтобы получить представление коллекции.

  0

@S. Lott Спасибо, не понимал, что это плохо отразилось, когда я впервые подал заявку. 22 фев. 092009-02-22 03:33:02

6

Хотя в большинстве случаев я бы рекомендовал то, что вы изначально заявили, используя Javascript для загрузки каждого виджета, поскольку это не вариант. Думаю, вам нужно будет что-то сделать совсем другое.

В дополнение к использованию подхода, который пытается использовать один фронт-контроллер, все необходимые виджеты и их создание, альтернатива, которую вы, возможно, захотите рассмотреть, более эффективно использует шаблоны в Мако.

Вы можете определить небольшие блоки как Mako def, которые, конечно же, имеют полную мощность Python. Чтобы избежать загрязнения ваших шаблонов Mako с помощью логики домена, обязательно сохраните это все в своих моделях и просто вызовите экземпляры модели в Mako def, если это необходимо для того, чтобы этот компонент страницы сам построил.

Огромное преимущество этого подхода состоит в том, что, поскольку аргумент поддержки Mako def's args, вы можете фактически иметь компоненты страницы, которые решат, как кэшировать себя.Возможно, боковая панель должна быть кеширована в течение 5 минут, но верхняя панель изменяет каждый удар, например. Кроме того, поскольку компонент запускает удаление db, вы будете сохранять удары db, когда компонент кэширует себя.

ToscaWidgets не имеет производительности, чтобы сделать его очень доступным вариантом в более крупном масштабе, поэтому я бы держался подальше от этого.

Что касается некоторых настроек вашей существующей идеи, убедитесь, что на самом деле не используете контроллеры Pylons для «виджетов», поскольку они делают гораздо больше, если необходимо, для поддержки WSGI, который вам не нужен для создания страницы с виджетами.

Я бы рассмотреть возможность все классы виджетов работают так:

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

Тогда просто ваш главный Мако шаблон итерацию через экземпляры виджета, и называть их, чтобы сделать их.


0

Вы можете использовать ToscaWidgets, чтобы инкапсулировать ваши виджеты, а также сохраненный список виджетов, включенных для каждого пользователя (например, в базе данных или другой службе). Передайте список разрешенных ToscaWidgets в представление, и виджеты будут отображаться сами (включая динамическое добавление ссылок CSS/JavaScript на страницу, если виджет требует этих ресурсов).

  0

@Chris - Недавно я начал изучать Тоску, у меня создалось впечатление, что это был инструмент построения формы или я ошибаюсь? 17 мар. 092009-03-17 16:33:37

  0

@ David - нет, он не является конкретным форматом, хотя он предоставляет множество виджетов на основе форм в tw.forms. Сам TW представляет собой библиотеку инкапсуляции «виджета», которая может обернуть любой повторно используемый компонент пользовательского интерфейса. Документы, возможно, не делают это очевидным. 01 апр. 092009-04-01 00:14:31