所以我有这个 Web 应用程序为数据库运行 Flask、React 和 sqlalchemy。我现在正在准备托管,因此我正在设置不同的环境变量(开发、测试、生产)进行测试。但是当我在 VS code 的命令 shell 中设置环境变量时
set FLASK_ENV=development
set FLASK_APP=run.py
我收到此错误:
FLASK_ENV is set to: None
Traceback (most recent call last):
File "C:\...\Python\Hacklab-sem-1\remoire\run.py", line 5, in <module>
app = create_app()
^^^^^^^^^^^^
File "C:\...\Python\Hacklab-sem-1\remoire\app\__init__.py", line 26, in create_app
db.init_app(app)
File "C:\...\Python\Python312\Lib\site-packages\flask_sqlalchemy\extension.py", line 355, in init_app
raise RuntimeError(
RuntimeError: Either 'SQLALCHEMY_DATABASE_URI' or 'SQLALCHEMY_BINDS' must be set.
我在 run.py 文件中有这一行
print(f"FLASK_ENV: {os.environ.get('FLASK_ENV')}")
正如您所看到的,它表示 env 设置为 None,但是如果我在调用 create_app() 之前在 run.py 文件本身中手动设置 env
os.environ['FLASK_ENV'] = 'development'
一切都在运行。据我所知,范围似乎是正确的,在运行命令之前,我将目录直接更改为 remoire 文件夹,这是 run.py 以及 app 文件夹的位置,我似乎无法弄清楚出问题。这是出现问题的 create_app() 函数
def create_app():
app = Flask(__name__)
env = os.environ.get('FLASK_ENV', 'production')
if env == 'development':
app.config.from_object('config.DevelopmentConfig')
elif env == 'testing':
app.config.from_object('config.TestingConfig')
else:
app.config.from_object('config.ProductionConfig')
db.init_app(app)
.
.
.
设置和导出是 bash 中两种不同的操作。当您运行
set FLASK_ENV=development
时,您不会导出任何环境变量。您需要使用export FLASK_ENV=development
。
更好的是,我建议您使用
.env
文件来管理您的环境变量。
如果您使用
flask
cli 脚本运行 Flask 应用程序,并且您的环境中安装了 python-dotenv
并且有一个包含环境变量的 .env
文件,flask 会自动从您的 .env
加载环境变量
文件。
如果您有一个单独的
run.py
文件使用工厂创建应用程序实例,并且您通过 python run.py
运行它并拥有 .env
文件,那么您需要自己加载环境变量,默认情况下再次从 .env
文件加载环境变量。
from dotenv import load_dotenv
from app import create_app
load_dotenv()
app = create_app()