在 VS Code 上运行 Flask 应用程序时无法识别 launch.json 中的环境变量

Posted

技术标签:

【中文标题】在 VS Code 上运行 Flask 应用程序时无法识别 launch.json 中的环境变量【英文标题】:Environment variables in launch.json not recognized when running Flask application on VS Code 【发布时间】: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 文件)运行应用程序时生效。 我没有通过调试器运行应用程序。当我这样做时,它会识别环境变量。 【参考方案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

【讨论】:

以上是关于在 VS Code 上运行 Flask 应用程序时无法识别 launch.json 中的环境变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MacOS Monterey 上修复 VS COde“致命错误:运行时:bsdthread_register 错误”

从 VS Code 在模拟器上同步应用程序非常慢

Configuration.GetConnectionString 在 VS Code 上运行 asp.net 核心时返回 null 但在 Visual Studio 上很好

在 VS Code 中在 Android 手机上运行 Flutter 应用

选择一个 Python Web 框架:Django vs Flask vs Pyramid

VS Code 中不能运行脚本(因为在此系统上禁止 运行脚本)