在什么情况下,是否需要在烧瓶中使用多个应用? (不是蓝图)

时间:2015-02-01 14:46:31

标签: flask

烧瓶代码库中的许多复杂性是由于可以创建多个应用程序的事实。虽然我掌握了这种架构,但是我不太了解, 时是否真的发生了?或为什么确实需要它?

要明确,我谈论蓝图。我说的是:

from flask import Flask, Blueprint

bp = Blueprint('common', __name__)

@bp.route('/')
def index():
    return 'Hello World!'

def make_app(filename):
    app = Flask(__name__)
    app.config.from_pyfile(filename)
    app.register_blueprint(bp)
    return app

app1 = make_app('config1.py')
app2 = make_app('config2.py')

2 个答案:

答案 0 :(得分:3)

好问题!我将为Miguel添加(希望)补充方法。

应用程序,蓝图和模块中的分离是非常强大的,尽管正如你所指出的那样,它会使学习曲线变得陡峭。

蓝图提供了一种将模块和功能聚合到一个组中的好方法,然后可以使用自己的路由,方法等将其作为一个整体进行管理。蓝图可以比python"超级模块更有用#34;因为它有预定义的烧瓶设施,使管理更容易(注册路线等)。蓝图与模块正交,这很有用,因为即使它们的配置不同,您也可以在多个蓝图之间共享模块。

应用程序与蓝图和模块正交。蓝图和模块涉及功能的组和层次结构,而应用程序则更关注会话,流程以及整体数据和通信范围的处理。通过从蓝图和模块中解耦(会话/进程/数据范围),您可以将应用程序的运行方式与运行的功能/功能/蓝图分开。

那为什么这对应用来说很重要?以下是脱钩派上用场的一些情况:

  • 不同的功能范围 - 您的normal_app是一款多人游戏,允许用户登录并玩游戏。您还有一组游戏管理员,他们能够登录并玩游戏,但有超级大国(查看其他信息,杀死不守规矩的玩家等)。您可以通过创建包含normal_app的所有蓝图的admin_app来实现此目的,还可以创建额外的admin_superpowers蓝图。

  • 不同的会话/流程范围 - 您决定不想让正常的玩家冒险攻击他们的系统,以便能够获得管理超级大国,所以现在配置{{ 1}}在不同的服务器实例上运行并使用其他身份验证协议,以确保访问权限与admin_app分开。

  • 不同的通信范围 - 您认为即使普通游戏服务器发生故障,您也希望normal_app继续运行。因此,您需要将其重新配置为不同的,更可靠的应用程序服务器,并在多个端口上运行以实现冗余。

  • 不同的数据范围 - 您的开发人员需要能够测试新功能,但显然不能使用实时游戏。因此,您创建一个admin_app,其中包含developer_app的所有蓝图,但配置为使用各种虚拟数据库,并吐出各种运行时诊断程序。与普通应用程序不同,它可以按比例缩小,也可以在开发人员的笔记本电脑上运行。

......等等。希望有所帮助。

答案 1 :(得分:2)

非常好的问题!我想你是以错误的方式看待它。我的想法是不要让多个相同的应用程序并排运行,我同意这不是很有用(测试时除外,正如我在下面的上一个例子中所示)。

考虑您可以在同一进程中运行多个不同的应用程序。例如,Web应用程序和API。当然,您可以将它们作为单个应用程序托管,但是如果您希望它们为了安全目的而在不同的端口上进行侦听,那么唯一的方法是拥有两个单独的应用程序。您当然可以单独创建应用程序,但在同一过程中使用它们可能更方便,至少在开发过程中是这样。

如果您有一些部件处理您不希望其他部件可以访问的敏感信息,那么将大型应用程序拆分为子应用程序也会被视为更安全。两个应用程序之间的分离大于两个蓝图之间的分离,因此如果您担心安全性,攻击等,将每个子应用程序沙箱化到自己的子包中并让它在单独的端口上进行侦听可能是个好主意。

我还有一个。在编写单元测试时,专门为每个测试创建一个应用程序非常有用,因为这允许根据每个测试需要执行的功能来使用不同的配置。考虑到出于性能原因,单元测试可能会并行运行,因此您可以再次使多个应用程序同时处于活动状态。如果Flask阻止你并行运行测试,那就不好了。