使用Flask应用程序

时间:2017-02-15 22:07:28

标签: flask flask-sqlalchemy flask-migrate python-packaging

我使用flaskflask-sqlalchemy进行了应用程序设计。为了在模型更改时控制数据库迁移,我使用flask-migrate来包装alembic并在flask-script管理上下文中使用。

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

  1. 主应用程序包的最小依赖关系
  2. 根据主要应用程序模块,允许使用辅助包分发管理脚本和测试数据以进行迁移和部署
  3. 项目结构如下

    /
     tests/ #test data
     migrations/ #alembic root include env.py and alembic.ini
     myapp/ # application package
     setup.py
     manage.py
     wsgi.py
    

    我的manage.py看起来很像以下。这是我通过将alembic对象附加到flask-migrate中的应用程序来避免主应用程序包中的任何Migratemanage.py依赖项的方法。这也允许我在与通用flask / app配置相同的配置文件中控制迁移配置(因为配置上下文由管理员推送并且Migrate.init_app

    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()
    

    应用程序子管理器myapp.database.database_manager启用python manage.py database create/drop/test_data等命令,它使用sqlalchemy创建表并使用tests/目录中的test_data填充表,但不会挂钩任何迁移脚本,并且允许我使用python manage.py migration init/revision/migrate/...使用应用程序配置上下文执行flask-migrate / alembic命令。

    我正在尝试分发此应用程序以在我们的内部服务器上进行部署。目前正在使用两种分发用例

    1. 安装新服务器

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

      • 更新来源分发
      • 使用manage.py -c /path/to/server/config migration upgrade使用当前应用上下文来提取数据库
      • 服务器继续指向wsgi.py
    3. 我想将此发行版转移到wheel / packages,以便我可以在我们的公司内部网上自动部署,所以我在这里看到的是我想将我的包拆分为主包myapp仅包含Flask框架依赖项和wsgi入口点,myapp-manage包含manage.pytestsmigrations目录。

      因此,在完美的世界中,应用程序将安装在具有全局配置文件的系统上,并且特定管理用户可以访问管理包以执行升级。

      现在我正倾向于使用setup-app.pysetup-manage.py分配分发,以便从同一源代码分发中创建两个单独的包。有没有更合适的方法来使用烧瓶应用程序打包迁移和管理脚本?我已经挖掘了文档,虽然它清楚如何打包烧瓶应用程序,管理脚本和迁移的分发策略不太清楚。

0 个答案:

没有答案