Python 如何从主烧瓶应用程序动态创建和启动辅助烧瓶应用程序?

Python 如何从主烧瓶应用程序动态创建和启动辅助烧瓶应用程序?,python,flask,Python,Flask,我有一个flask应用程序,我希望能够使用它在不同的端口上启动另一个flask应用程序(主应用程序运行时未知)。这些子应用程序非常简单,可以根据需要向上/向下旋转,但是,最好在主flask应用程序中完成 我不相信DispatcherMiddle软件是解决方案,因为主应用程序启动时子应用程序是不确定的 关于在类中使用flask,这是我开始的路线。下面是我正在使用的稍微修改过的文件: from flask import Flask, request, redirect, Response cla

我有一个flask应用程序,我希望能够使用它在不同的端口上启动另一个flask应用程序(主应用程序运行时未知)。这些子应用程序非常简单,可以根据需要向上/向下旋转,但是,最好在主flask应用程序中完成

我不相信DispatcherMiddle软件是解决方案,因为主应用程序启动时子应用程序是不确定的

关于在类中使用flask,这是我开始的路线。下面是我正在使用的稍微修改过的文件:

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'
但是,当我尝试从主应用程序的routes文件调用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'
警告:自动忽略app.run(),因为应用程序是从flask命令行可执行文件运行的。考虑将App.Rune()置于if if NaveEng==“Sy-MnIsI*”守护程序中,以沉默此警告。< /代码> 

我目前正在开发模式下使用
flask run
启动主应用程序

这是一条正确的道路,还是有更好的方法?如果建议使用类似的类实现,我如何绕过app.run()警告


编辑:我正在努力完成的背景。这个主应用程序就像一个管理面板,运行在一个带有防火墙的端口上,防火墙限制谁可以访问它。主应用程序功能的一部分是接受和存储辅助应用程序的配置。因此,用户将能够发布辅助应用程序将提供的HTML和1-4条基本路由(以及其他配置)。在主应用程序中,我试图允许flask应用程序根据用户指定的配置运行。因此,当用户选择临时为该应用程序提供服务时,可以在外部看到的单独端口上启动辅助烧瓶应用程序。

我会在这里考虑时间-精力权衡。与构建一个构建应用程序的应用程序不同,培训用户自己构建应用程序可能更容易,甚至可以为他们提供基本模板,让他们快速提高生产效率

您还提到了通过门户提交的自定义HTML,这听起来像是希望用户通过门户提交Jinja2模板,这反过来需要写入文件系统并由子应用程序加载。如果用户提交错误的模板,这无疑会产生问题,导致应用程序崩溃,并带走所有其他子应用程序,因为所有内容都是从同一个python解释器运行的

然而,我理解培训潜在非技术人员使用烧瓶的困难。如果您仍然想坚持门户的想法,那么可能需要定义要使用户可配置的配置值,并实现CRUD系统来验证这些输入并将其存储在数据库中

当子应用程序启动时(在单独的python进程中),您可以从数据库中提取这些值并使用它们来构造应用程序。flask团队的davidism给出了一个答案

我还要看看docker。Flask mega教程提供了一个示例,可以让您了解这些功能

还有一个函数,它提供了python中docker终端命令的所有功能

所以理论上你可以:

  • 向用户提供门户的父应用程序,允许用户定义需要的配置,该配置经过验证并存储在数据库中

  • 一个子应用程序,它将从数据库中读取配置,并基于此配置初始化Flask应用程序对象。这可以手动配置为在docker容器中运行

  • 能够使用python docker sdk从父应用中启动子应用容器。一旦你已经使子应用程序docker具备功能,应该很容易

这将具有隔离所有组件的优势,但可能需要比预期更多的开发时间


当然,你可以在用户培训和自动化之间找到一些中间点,这将满足你的目的。

简单性和可扩展性的一个很好的结合是将一个单独的应用程序作为
子进程运行(“python运行我的应用程序,env={“PORT”:new_PORT},shell=True)
@Fian I可能是错误的,但我认为这需要我的第二个应用之前在run_my_app.py中定义。我正在探索类的实现,因为我希望将数据发布到主应用程序,以允许自定义辅助应用程序。您能否更具体地说明主应用程序将接收哪些数据以及它将如何自定义第二个应用程序?听起来您正试图在Flask中实现您自己的缩放或负载平衡系统,而其他系统(如docker)可以提供此功能,这可能是浪费时间<代码>这是正确的方法还是有更好的方法?
你能用更多的上下文更新这个问题/完整地描述你实际上想要实现的目标,这样我们就可以为你提供正确的工作工具。@v25我编辑了这篇文章,以便更好地满足我的意图。主应用程序将要做的一部分是接收配置,它可以使用子应用程序启动。子应用程序将很简单,并且只会临时运行。它并不意味着是一个扩展/负载平衡器。希望这会有所帮助。将访问管理门户的用户。。。他们属于(1)公众互联网用户,(5)公司内部员工,(10)整个事情都是一个概念/爱好的范围吗?