【问题标题】:Execute Flask CLI command only if app in development mode仅当应用程序处于开发模式时才执行 Flask CLI 命令
【发布时间】:2023-03-12 04:04:01
【问题描述】:

我将Flask-Migrate 集成到我的项目中。当我使用开发模式 (FLASK_ENV='development') 时,我通常会调用 flask db migrate 将更改应用到 SQLite 数据库。但是,在测试模式下 (FLASK_ENV='testing') 我使用的是内存存储 (sqlite:///:memory:),调用db migrate 是没有意义的,因为它最终会抛出error。有没有办法在 Flask CLI 中创建“pre_execute”钩子来检查在执行命令之前使用了哪个 ENV?因此,例如,如果 FLASK_ENV 设置为 testing,则调用 flask db init 将导致命令执行中止。我已经尝试过这样的事情,但没有奏效:

@click.group(cls=FlaskGroup, create_app=create_app)
def cli():
    '''
    Main entry point.
    '''
    if app.config.ENV == ENV.TESTING:
        print('Running in TESTING mode...Aborting!')
        sys.exit(1)

问题:如何在某些FLASK_ENV 设置下中止执行cli 命令?

编辑:我正在从.env 文件加载FLASK_ENV 值。

【问题讨论】:

  • 不确定这是否与问题有关,但您似乎使用了错误的命令。 init 命令仅在创建项目时使用一次。当您需要记录对数据库的更改时,使用migrate 命令。 upgrade 命令用于通过这些更改升级您的数据库。我认为你需要更好地解释你在做什么以及为什么,因为不清楚。
  • @Miguel 如果 Flask 应用程序将 FLASJ_ENV 设置为 testing,我正在尝试禁止执行 Flask-Migrate 命令。
  • 我知道您正在尝试这样做,但为什么呢?当您不想执行命令时,不调用命令不是更容易吗?对你的问题仍然很困惑。
  • @Miguel 不执行命令不是问题,但我宁愿明确处理错误并显示解释命令执行失败原因的消息。如果开发人员只会看到堆栈跟踪消息,他会感到困惑并且不会立即了解错误原因。
  • 还是一头雾水。现在您第一次提到堆栈跟踪。你有错误吗?你为什么不把它包括在你的问题中?似乎很重要。

标签: python flask flask-migrate flask-cli


【解决方案1】:

好的,也许一开始我试图用错误的方法解决问题,但我终于找到了处理问题中提到的错误的方法。因为我从文件中加载了FLASK_ENV 的值,所以每次我想切换环境时都需要手动更改它。所以我所做的是我修改了我的测试 CLI 命令以在每次执行 pytest 之前将 FLASK_ENV 的值设置为 testing

@click.command()
def test():
    '''
    Run tests.
    '''
    os.environ['FLASK_ENV'] = ENV.TESTING
    pytest.main(['--rootdir', './tests'])

现在即使FLASK_ENV.env 文件中设置为development,我仍然可以在testing 模式下运行测试,而无需更改文件中的值。

【讨论】:

    猜你喜欢
    • 2017-05-23
    • 2020-09-24
    • 2017-05-11
    • 2016-04-12
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    相关资源
    最近更新 更多