Задать вопрос

Как реализовать plugin-ы/расшерения?

Привет всем
Я использую framework (falcon) для написания АПИ.
Я хочу сделать модули, которые будут обслуживать каждый свой uri.
Пример кода из фреймворка:
class ThingsResource:
    def on_get(self, req, resp):
        """Handles GET requests"""
        resp.body = ('\nI've always been more interested in\n' )

app = falcon.API()
things = ThingsResource()
app.add_route('/things', things)

Я хочу сделать авторегистрацию модуля. Подключил — все работает.
Так вот если я раскладываю "свои модули" по python - модулям, то они не видят переменной app, которая в другом namespace.
А как по другому сделать я ума не приложу
  • Вопрос задан
  • 2453 просмотра
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@brake
Я делал так (безотносительно к фреймворку, просто скрипт с плагинами):
1. Продумал структуру папок для плагинов, допустим, в самом простом случае, папка plugin
2. Продумал API плагина, допустим, каждый плагин должен иметь метод run()

В итоге в папке plugin (которая должна быть и пакетом и содержать модуль __init__.py) лежат все модули-плагины.
Далее, в коде, делаем загрузчик плагинов, который использует функцию __import__() для загрузки пакета плагинов, анализа всех модулей пакета и импорта нужного модуля.

def load_plugin_module(plugin):
    '''Загрузка модуля плагина по имени.
    plugin - имя модуля плагина.
    Возвращает:
        mod - модуль плагина
    '''
    try:
        # fromlist=[plugin] - здесь просто МАГИЯ,
        # без этого не импортируется то, что нужно
        vpkg = __import__(PLUGIN_DIR, fromlist=[plugin])
        return getattr(vpkg, plugin)
    except ImportError:
        raise RuntimeError('Plugin %s not found' % plugin)

    except ValueError:
        raise RuntimeError('Invalid plugin name %s' % plugin)


Поскольку мы знаем API каждого плагина (он у нас единый), то после импорта нужного плагина мы знаем как к этому плагину обращаться.

plug = load_plugin_module(known_plugin_name)
plug.run()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы