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