在什么情况下,flask 中需要多个应用程序?(不是蓝图)

LBa*_*ret 6 flask

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')
Run Code Online (Sandbox Code Playgroud)

toh*_*ter 5

好问题!我将添加一个(希望)对 Miguel 的补充方法。

Flask 中的应用程序、蓝图和模块之间的分离非常强大,尽管正如您所指出的,它使学习曲线变得陡峭。

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

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

那么为什么这对应用程序很重要呢?以下是解耦派上用场的一些情况:

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

  • 不同的会话/进程范围- 您决定不想让普通玩家冒着黑客攻击其系统以获得管理员超级权力的风险,因此您现在配置admin_app为在不同的服务器实例上运行并使用其他身份验证协议,以确保访问是与 分开的normal_app

  • 不同的通信范围- 您决定即使正常的游戏服务器出现故障,您也希望其admin_app继续运行。因此,您将其重新配置到不同的、更可靠的应用程序服务器,并在多个端口上运行以实现冗余。

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

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


Mig*_*uel 4

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

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

当您有某些部分处理您不希望其他部分访问的敏感信息时,将大型应用程序分解为子应用程序也可以被认为更安全。两个应用程序之间的间隔比两个蓝图之间的间隔更大,因此如果您担心安全、攻击等问题,将每个子应用程序沙箱到其自己的子包中并让它在单独的端口上侦听可能是个好主意。

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