У меня есть приложение фляги, которое я хотел бы использовать для запуска другого приложения фляги (неизвестного во время выполнения основного приложения) на другом порту.Эти дочерние приложения предназначены для того, чтобы быть очень простыми и вращаться по мере необходимости, однако желательно, чтобы это выполнялось в приложении основной колбы.
Я не верю, что 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 основных маршрута (среди прочих конфигураций), которые будет обслуживать вторичное приложение.В основном приложении я пытаюсь разрешить запуск приложения фляги на основе настроек, указанных пользователем.Поэтому, когда пользователь выбирает временное обслуживание этого приложения, приложение вторичной колбы запускается на отдельном порту, который можно увидеть снаружи.