Как я могу динамически создавать и запускать дополнительное приложение для колб из моего основного приложения для колб? - PullRequest
0 голосов
/ 25 января 2019

У меня есть приложение фляги, которое я хотел бы использовать для запуска другого приложения фляги (неизвестного во время выполнения основного приложения) на другом порту.Эти дочерние приложения предназначены для того, чтобы быть очень простыми и вращаться по мере необходимости, однако желательно, чтобы это выполнялось в приложении основной колбы.

Я не верю, что DispatcherMiddleware является решением, поскольку дочернее приложение не определено при запуске основного приложения.

Этот вопрос об использовании колбы внутри классамаршрут я начал вниз.Вот слегка измененный файл, который я использую:

from flask import Flask, request, redirect, Response


class EndpointAction(object):

    def __init__(self, action):
        self.action = action
        self.response = Response(status=200, headers={})


    def __call__(self, *args):
        self.action()
        return self.response


class AppWrapper(object):

     def __init__(self, name, host='0.0.0.0', port=8080, cert_path=None, key_path=None):
        self.app = Flask(name)
        self.host = host
        self.port = port

        if None not in [cert_path, key_path]:
            self.context = (cert_path, key_path)
        else:
            self.context = None


    def run(self):
        self.app.run(host=self.host, port=self.port, ssl_context=self.context)


    def add_endpoint(self, endpoint=None, endpoint_name=None, handler=None):
        self.app.add_url_rule(endpoint, endpoint_name, EndpointAction(handler))


def action():
    return 'welcome to my page'

Однако, когда я пытаюсь вызвать run из файла маршрутов моего основного приложения, я получаю предупреждение о том, что app.run() игнорируется.

@app.route('/start')
def start():
    child = AppWrapper(name='test')
    child.add_endpoint(endpoint='/ad', endpoint_name='ad', handler=action)
    child.run()
    return 'started'

Warning: Silently ignoring app.run() because the application is run from the flask command line executable. Consider putting app.run() behind an if __name__ == "__main__" guard to silence this warning.

В настоящее время я запускаю основное приложение, используя flask run в режиме разработки.

Это правильный путь для перехода или есть лучший путь?Если аналогичная реализация класса является предлагаемым решением, как я могу обойти предупреждение app.run ()?

РЕДАКТИРОВАТЬ: Справочная информация о том, что я пытаюсь достичь.Это основное приложение похоже на панель администратора, работающее на порте с ограничением брандмауэра, который может получить к нему доступ.Одна часть функциональности основного приложения - принимать и хранить конфиги для дополнительного приложения.Таким образом, пользователь сможет POST HTML и 1-4 основных маршрута (среди прочих конфигураций), которые будет обслуживать вторичное приложение.В основном приложении я пытаюсь разрешить запуск приложения фляги на основе настроек, указанных пользователем.Поэтому, когда пользователь выбирает временное обслуживание этого приложения, приложение вторичной колбы запускается на отдельном порту, который можно увидеть снаружи.

1 Ответ

0 голосов
/ 25 января 2019

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

Также вы упоминаете, что пользовательский HTML-файл был добавлен через вашпортал, который звучит так, как будто вы хотите, чтобы пользователи отправляли шаблоны Jinja2 через портал, который, в свою очередь, должен был бы быть записан в файловую систему и загружен дочерними приложениями.Это, несомненно, создаст проблемы, если пользователи отправят шаблоны с ошибками, которые приводят к сбою приложения, забирая с собой все остальные дочерние приложения, потому что все работает из одного интерпретатора Python.

Однако я понимаю сложностьподготовки потенциально нетехнического персонала для использования колбы.Если вы все еще хотите придерживаться идеи портала, возможно, стоит определить значения конфигурации, которые вы хотите сделать настраиваемыми пользователем, и внедрить систему CRUD для проверки этих входных данных и сохранения их в базе данных.

Когдадочернее приложение запускается (в отдельном процессе Python), вы можете извлечь эти значения из базы данных и использовать их для создания приложения.Дэвидизм из команды флаконов имеет ответ, который говорит о извлечении конфигурации из базы данных .

Я бы также посмотрел на докер.В мега-учебнике Flask есть целый раздел по докеру , который должен дать вам представление о возможностях.

Существует также Python SDK для Docker , который дает вам всеВозможности команд док-терминала в Python.

Таким образом, теоретически вы можете иметь:

  • Родительское приложение, которое представляет пользователям портал, позволяя им определить требуемый конфигурационный файл, который проверяется и сохраняется вбаза данных.

  • Дочернее приложение, которое будет считывать конфигурацию из базы данных и инициализировать объект приложения Flask на основе этой конфигурации.Это можно настроить вручную для запуска в Docker-контейнере.

  • Возможность запуска контейнеров дочерних приложений из родительского приложения, используя для этого python docker sdk.Это должно быть легко после того, как вы уже сделаете дочернее приложение совместимым с докером.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...