2012-03-10 4 views
2

Я хотел бы знать, как редактировать реестр пирамиды во время выполнения. Ну, я не совсем уверен, что мне нужно изменить.Добавление маршрутов динамически в пирамиду

Я знаю, что могу расширять пирамиду с помощью config.include (...). Но как только вызывается config.make_wsgi_app(), похоже, нет способа добавить маршруты или новые каталоги mako. Любое изменение регистрации в threadlocals или настройках не влияет на поведение приложения.

Моя цель - добавить плагин во время выполнения. Вот пример использования.

Кто-то установить мою Appserver работает пирамида ... затем установить некоторые плагины

пункт установить page_plugin

затем в/конфиги

Там приведен список установленных плагинов, и вы можете выбрать, какие из них являются активирован или нет. В настоящее время я знаю только один способ сделать это:

Использование entry_points Я могу видеть мои плагины и в основной функции пирамиды, я могу зарегистрировать плагины. Используя файловое хранилище, я могу проверить каждое состояние плагинов: [установить, установить, удалить, удалить, отключить]

Таким образом я могу с самого начала установить/удалить мои плагины.

Для просмотра любых изменений необходимо перезагрузить сервер.

состояния установки: будет установлен на следующей загрузке установлен: установлен и активен удаления: будет удалить при следующей загрузке неустановленных: деинсталлируется отключен: не удаляется, но не активировали

установки/удаления используются при необходимости настроить базу данных

Я думаю, что нет другого другого способа сделать это, поскольку нет «remove_view». Возможно, я могу перезагрузить сервер. И он загрузит новую конфигурацию.

[EDIT]

Там нет функции для удаления маршрута или antyhing. Я полагаю, что realoding сервер, вероятно, является простым и простым способом сделать это ... и, вероятно, чище перезагрузить сервер, чем забыть выгружать некоторые материалы из плагинов.

ответ

2

Можно внести изменения в реестр во время выполнения:

config = Configurator(registry=request.registry) 
config.add_route(...) 
config.commit() 

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

Добавление съемных видов возможно, но я бы не сделал этого на уровне «добавления или удаления маршрутов». Вместо этого я предлагаю использовать пользовательские предикаты на ваших маршрутах, которые контролируют соответствие маршрута или нет.

def is_enabled(info, request): 
    return True if route_should_be_enabled else False 

config.add_route('my_plugin_head', '/foo/{bar}', custom_predicates=[is_enabled]) 

Таким образом, если is_enabled возвращает False, маршрут никогда не сопоставляется и фактически игнорируется.

+0

Это действительно интересно, мне нужно взглянуть на это, и я придумаю какой-то результат, я думаю. –

+0

Кажется, хорошо работает спасибо, я использую обход в настоящее время в одном проекте, так как я использую зодб, и мне кажется, что это единственный логический способ сделать это. У меня есть другой проект с mongodb, который в настоящее время определяет их собственные маршруты, но я считаю, что могу добиться такого же результата с обходом. Исходя из пилонов, я действительно привык к маршрутам и испугался магии за обход –

+0

У меня все еще есть вопрос, когда вы говорите, что редактирование реестра не является потокобезопасным. Вы имеете в виду, что если два человека редактируют реестр, он потерпит неудачу или, к сожалению, принесет неожиданный результат. должен будет посмотреть, как это делается, но я вижу две возможности. Конфигуратор конфигурации конфигурации, а затем нажмите его в реестр и полностью перезаписать. Или нажимайте только новые или измененные конфиги. Мое предположение переписывается. Поэтому, если кто-то редактирует, когда кто-то его редактирует. Изменения никогда не будут сохранены. Я не думаю, что сейчас это очень важно, но хорошо иметь в виду. –

Смежные вопросы