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
相关产品推荐
相关产品推荐

