【问题标题】:Environment variables in launch.json not recognized when running Flask application on VS Code在 VS Code 上运行 Flask 应用程序时无法识别 launch.json 中的环境变量
【发布时间】:2021-12-10 11:53:33
【问题描述】:

下面显示的是我的 Flask 应用程序的 launch.json 文件中的代码。我在"env": {} 部分定义了各种环境变量。但是,当我从 run.py 脚本运行 Flask 应用程序时,它似乎无法识别变量。尽管"FLASK_DEBUG" 设置为"1",应用程序仍然在**Debug mode: off** 上运行。

有人知道为什么吗?

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Flask",
            "type": "python",
            "request": "launch",
            "module": "flask",
            "env": {
                "FLASK_APP": "run.py",
                "FLASK_ENV": "development",
                "FLASK_DEBUG": "1",
                "EMAIL_USER": "farmgo.project.21@gmail.com",
                "EMAIL_PASS": "password",
            },
            "args": [
                "run",
                //"--no-debugger"
            ],
            "jinja": true,
        }
    ],
}

如果我设置:

if __name__ == '__main__':
    app.run(debug=True)

然后应用程序确实在调试模式下运行。但是,我仍然无法获取其他环境变量:

>>> import os
>>> print(os.environ.get('FLASK_DEBUG'))
None

【问题讨论】:

  • 有多个可能的冲突大纲,例如有一个.env 文件,在this SO post 中进行了概述
  • 您实际上在运行through the debugger 应用程序吗?似乎您没有这样做,因为您提到使用“run.py 脚本”并且您正在从 python 控制台显示>>>。 launch.json 配置仅在通过调试器(读取launch.json 文件)运行应用程序时生效。
  • 我没有通过调试器运行应用程序。当我这样做时,它会识别环境变量。

标签: python flask visual-studio-code environment-variables


【解决方案1】:

launch.json 文件仅在通过 VS Code 的调试器运行您的应用时使用。

见https://code.visualstudio.com/docs/python/debugging#_initialize-configurations:

初始化配置

在调试会话期间,配置驱动 VS Code 的行为。 配置在 launch.json 文件中定义,该文件存储在 .vscode 工作区中的文件夹。

既然你提到了

...我从 run.py 脚本运行我的烧瓶应用程序,...

您正在使用 Python shell 进行测试

>>> import os  
>>> print(os.environ.get('FLASK_DEBUG'))  
None 

意味着您永远不会使用 VS Code 的调试器,因此永远不会加载/读取这些环境变量。

我建议阅读 VS Code 的 tutorial on Python Debugging,尤其是 Flask Debugging 部分。您已经完成了第一步,即添加一个带有 Flask 配置的 launch.json 文件。这里的重点是"module": "flask" 行并添加"--no-debugger" arg:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "run-flask",
            "type": "python",
            "request": "launch",
            "module": "flask",
            "env": {
                "FLASK_APP": "run.py",
                "FLASK_ENV": "development",
                "FLASK_DEBUG": "1",
                "EMAIL_USER": "farmgo.project.21@gmail.com",
                "EMAIL_PASS": "password",
            },
            "args": [
                "run",
                "--no-debugger"
            ],
            "jinja": true,
        },
    ]
}

然后只需从调试器下拉列表中选择该配置:

使用一些快速入门 Flask 代码进行测试:

import os
from flask import Flask

app = Flask(__name__)

@app.route("/")
def root():
    env_names = [
        "FLASK_APP",
        "FLASK_ENV",
        "FLASK_DEBUG",
        "EMAIL_USER",
        "EMAIL_PASS",
    ]
    for env_name in env_names:
        print(os.environ.get(env_name))
    return "It works!"

...显示环境变量被正确读取,调试模式现在为"on"。

compared to the other answer using a .flaskenv file 的主要缺点是跨 IDE、与团队的其他成员或与 CI/CD 管道共享这些环境变量。您必须单独定义它们。

优势在于允许您使用常见的调试器功能,例如代码断点(从上面的屏幕截图中可以看出,在print 语句上停止执行),并在代码运行时查看变量的值.

【讨论】:

    【解决方案2】:

    在flask 中管理环境变量的一个好方法是使用.flaskenv 文件。您需要python-dotenv 才能使用它,并且该文件需要位于项目的根目录中。

    在您的 .flaskenv 文件中,只需像这样输入变量:

    FLASK_APP=run.py
    FLASK_ENV=development
    FLASK_DEBUG=1
    

    然后您可以使用 flask run 运行烧瓶,然后将加载环境。

    这样做意味着如果您在不同的机器上更改或加载项目,您可以跨 IDE 保留环境设置。

    查看这里了解更多信息 - Flask environment variables being ignored (FLASK_ENV and FLASK_APP) WINDOWS 10

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多