Flask 使用烧瓶应用程序打包烧瓶脚本和烧瓶迁移实用程序

Flask 使用烧瓶应用程序打包烧瓶脚本和烧瓶迁移实用程序,flask,flask-sqlalchemy,flask-migrate,python-packaging,Flask,Flask Sqlalchemy,Flask Migrate,Python Packaging,我有一个应用程序设计,使用flask和flask-sqlalchemy。为了在模型更改时控制数据库迁移,我使用flask migrate包装alembic并在flask脚本管理上下文中使用 我正在尝试决定如何拆分包分发以实现以下目标 主应用程序包的最小依赖项集 允许分发用于迁移和部署的管理脚本和测试数据,根据主应用程序模块的不同,可能使用辅助包 项目结构如下 / tests/ #test data migrations/ #alembic root include env.py and al

我有一个应用程序设计,使用
flask
flask-sqlalchemy
。为了在模型更改时控制数据库迁移,我使用
flask migrate
包装alembic并在
flask脚本
管理上下文中使用

我正在尝试决定如何拆分包分发以实现以下目标

  • 主应用程序包的最小依赖项集
  • 允许分发用于迁移和部署的管理脚本和测试数据,根据主应用程序模块的不同,可能使用辅助包
  • 项目结构如下

    /
     tests/ #test data
     migrations/ #alembic root include env.py and alembic.ini
     myapp/ # application package
     setup.py
     manage.py
     wsgi.py
    
    我的
    manage.py
    看起来像下面这样。这就是我如何通过将
    migrate
    对象附加到
    manage.py
    中的应用程序来避免主应用程序包中的任何
    alembic
    flask migrate
    依赖项的方法。这还允许我在与常规烧瓶/应用程序配置相同的配置文件中控制迁移配置(因为配置上下文由管理器推送,并使用
    Migrate.init_app

    应用程序子管理器
    myapp.database.database\u manager
    启用诸如
    python manage.py database create/drop/test\u data
    之类的命令,该命令使用sqlalchemy创建表并使用
    tests/
    目录中的测试数据填充表,但不挂接任何迁移脚本,并允许我使用
    python manage.py migration init/revision/migrate/…
    使用应用程序配置上下文执行
    flask migrate
    /
    alembic
    命令

    我正在尝试将此应用程序分发到内部服务器上部署。目前使用的分发用例有两种

  • 安装新服务器

    • 安装源代码分发
    • 创建新的配置文件以反映数据库主机等
    • 使用
      manage.py-c/path/to/config
      使用
      database create
    • 将HTTP服务器指向wsgi.py
  • 更新现有服务器

    • 更新源分布
    • 使用
      manage.py-c/path/to/server/config migration upgrade
      使用当前应用程序上下文调出数据库
    • 服务器继续指向wsgi.py
  • 我想将此发行版转移到wheels/packages,这样我就可以在公司内部网上自动部署,因此,我在这里看到的是,我想将我的包拆分为主包
    myapp
    ,其中只包含Flask框架依赖项和wsgi入口点以及
    myapp manage
    ,其中包括
    manage.py
    测试
    migrations
    目录

    因此,在理想情况下,应用程序将安装在具有全局配置文件的系统上,并且特定的管理用户将有权访问管理包以执行升级


    现在,我正在尝试使用
    setup app.py
    setup manage.py
    拆分发行版,以便从同一源发行版创建两个独立的包。是否有更合适的方法将迁移和管理脚本打包到flask应用程序中?我已经翻阅了这些文档,虽然很清楚如何打包flask应用程序,但管理脚本和迁移的分发策略却不太清楚

    通常,管理脚本随应用程序一起分发,而不是单独分发。将管理脚本作为一个单独的包有什么用途?@Miguel?企业级,但实际上是应用程序健壮性。该项目是一个内部制造管理站点,因此后端数据对业务至关重要。额外的复杂性-部署目标是嵌入式设备上的docker swarm。虽然有些部署是在我们设施中的受控环境中进行的,但其他部署是供应商的远程站点,我们不希望公开迁移详细信息,也不希望它们在服务期间或在有人好奇时意外触发数据库管理功能。一个简单的方法是削弱应用程序。此外,如何包装管理脚本,将其放入子包中?python如何处理发行版中的“manage.py”等根目录模块?我不明白的是,分离管理脚本有什么帮助,因为您必须安装所有这些文件才能执行升级。我想您可以安装管理脚本,运行升级,然后卸载它们,但如果您将所有内容都放在一个软件包中,并且升级完成后,您只需删除不希望用户看到的文件,则情况基本相同。在软件包/控制盘中分发可执行文件(如manage.py)的标准方法是在setup.py文件中将其定义为入口点。
    from myapp import db, create_app
    from myapp.database import database_manager #sub manager for creating/dropping db
    from flask_migrate import Migrate, MigrateCommand
    
    def _create_app(*args, **kwargs):
      app = create_app(*args, **kwargs)
      if migration is not None:
         migration.init_app(app)
      return app
    
    manager = Manager(_create_app)
    migration = Migrate(db = db)
    manager.add_command('database', database_manager)
    manager.add_command('migration', MigrateCommand)
    
    if __name__ == "__main__":
        manager.run()