You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask RESTful应用使用Waitress部署时无法加载环境变量

问题

我有一个Flask REST应用,此前在Ubuntu服务器上通过gunicorn运行,现需迁移至Windows环境改用waitress部署,但出现无法加载环境变量的问题。

项目结构:

  • app.py
  • setup.py
  • config.py
  • .env

.env文件内容:

VARIABLE_1=SECRET_1
DB_URL=URL_STRING

config.py文件内容:

import os
config = {
   "variable_1": os.getenv("VARIABLE_1"),
   "db_url": os.getenv("DB_URL")
}

setup.py初始化逻辑:

# 其他导入语句
from config import config

def create_app():
    app = Flask(__name__)
    # 更多初始化操作如CORS、JWT等

    app.config['MONGODB_SETTINGS'] = {
      "host": config['db_url']  # Waitress无法获取该环境变量,gunicorn和flask run可正常获取
    }

    # 其他操作
    return app

app.py入口文件:

from setup import create_app
from dotenv import load_dotenv
import os
from waitress import serve

if __name__ == "__main__":
   app = create_app()
   app.run()
else:
   for env_file in ('.env', '.flaskenv'):
     env = os.path.join(os.getcwd(), env_file)
     if os.path.exists(env):
       load_dotenv(env)  # 此处os.getenv可正常获取值,但setup.py中无法加载
   serve(app, host="some_host")

通过命令waitress-serve app:create_app启动应用时,config.py无法加载环境变量,但用flask run和gunicorn运行完全正常,请问需要添加或修改什么来解决这个问题?

解决方案

问题核心是加载环境变量的时机太晚:当用waitress-serve app:create_app启动时,waitress会先导入app模块,接着导入setup模块,再导入config模块——此时.env还未被加载,所以os.getenv拿不到值;后续else块里的load_dotenv执行时,config里的变量已经完成初始化,无法再更新。

提供两种可行解决方法:

方法一:提前加载环境变量(推荐)

把load_dotenv的逻辑移到app.py最顶部,确保在导入任何其他模块前完成环境变量加载:

from dotenv import load_dotenv
import os

# 优先加载环境变量
for env_file in ('.env', '.flaskenv'):
    env = os.path.join(os.getcwd(), env_file)
    if os.path.exists(env):
        load_dotenv(env)

# 再导入其他依赖模块
from setup import create_app
from waitress import serve

if __name__ == "__main__":
   app = create_app()
   app.run()
else:
   serve(app, host="some_host")

这样waitress导入app模块时会先加载.env,后续导入setup和config时,os.getenv就能获取到正确的环境变量值。

方法二:让config.py自行加载环境变量

修改config.py,让它独立负责加载环境变量,避免依赖外部模块的加载顺序:

import os
from dotenv import load_dotenv

# 加载环境变量
for env_file in ('.env', '.flaskenv'):
    env = os.path.join(os.getcwd(), env_file)
    if os.path.exists(env):
        load_dotenv(env)

config = {
   "variable_1": os.getenv("VARIABLE_1"),
   "db_url": os.getenv("DB_URL")
}

另外注意:原config.py的字典项之间缺少逗号,会触发语法错误,记得补上。

内容的提问来源于stack exchange,提问作者Navitas28

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:35:25