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

时间:2019-01-25 12:55:31

标签: python flask

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

我不认为DispatcherMiddleware是解决方案,因为子应用程序在主应用程序启动时不确定。

关于在课堂上使用烧瓶的question是我开始的路线。这是我正在使用的稍作修改的文件:

/ecommerce/api/option_types?...

但是,当我尝试从主应用程序的路由文件中调用run时,我收到警告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' 被忽略。

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.启动主应用程序。

这是走正确的道路还是有更好的方法?如果建议使用类似的类实现,则如何解决app.run()警告?

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

1 个答案:

答案 0 :(得分:0)

我会在这里考虑时间和精力之间的权衡。与其构建可以构建应用程序的应用程序,不如训练用户自己构建应用程序,甚至可以提供基本模板以使他们快速获得生产力。

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

但是,我知道培训潜在的非技术人员使用烧瓶的难度。如果您仍要坚持使用门户网站的想法,则可能值得定义要使用户可配置的配置值,并实施CRUD系统以验证这些输入并将其存储在数据库中。

子应用程序启动时(在单独的python进程中),您可以从数据库中提取这些值并使用它们来构建应用程序。烧瓶团队的大卫教派的答案为talks about pulling config from the database

我还要看看docker。 Flask大型教程有一个whole section on docker,应该可以让您对这些功能有所了解。

还有一个Python SDK for Docker,可为您提供python中docker终端命令的所有功能。

因此,从理论上讲,您可以:

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

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

  • 使用python docker sdk从父应用程序内启动子应用程序容器的能力。一旦使子应用具有docker-capable功能,就应该很容易。

这将具有隔离所有组件的优势,但是可能会比您期望的花费更多的开发时间。

当然,您可以在满足您的目的的用户培训和自动化之间找到中间立场。