Windows下Flask登录系统环境变量配置错误求助
Windows下Flask项目APP_SETTINGS未找到问题解决
问题背景
此前在Linux环境通过source .env可正常运行Flask项目,切换到Windows后,创建env.bat配置环境变量,内容如下:
set export SECRET_KEY=34uqhtg3rfhjqwief3woqijj4ki324jkDEWGF set export DEBUG=True set export APP_SETTINGS=config.DevelopmentConfig set export DATABASE_URL=sqlite:///db.sqlite set export FLASK_APP=src set export FLASK_DEBUG=1
运行manage.py时触发错误:
File "C:\Users\admin\Documents\Dash\manage.py", line 3, in <module> from src import app File "C:\Users\admin\Documents\Dash\src\__init__.py", line 8, in <module> app.config.from_object(config("APP_SETTINGS")) File "C:\Users\admin\Documents\ws\Dash\env\lib\site-packages\decouple.py", line 248, in __call__ return self.config(*args, **kwargs) File "C:\Users\admin\Documents\ws\Dash\env\lib\site-packages\decouple.py", line 107, in __call__ return self.get(*args, **kwargs) File "C:\Users\admin\Documents\ws\Dash\env\lib\site-packages\decouple.py", line 92, in get raise UndefinedValueError('{} not found. Declare it as envvar or define a default value.'.format(option)) decouple.UndefinedValueError: APP_SETTINGS not found. Declare it as envvar or define a default value.
相关代码文件
manage.py
from flask.cli import FlaskGroup from src import app cli = FlaskGroup(app) if __name__ == "__main__": cli()
src/init.py
from decouple import config from flask import Flask from flask_bcrypt import Bcrypt from flask_migrate import Migrate from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config.from_object(config("APP_SETTINGS")) bcrypt = Bcrypt(app) db = SQLAlchemy(app) migrate = Migrate(app, db) # Registering blueprints from src.accounts.views import accounts_bp from src.core.views import core_bp app.register_blueprint(accounts_bp) app.register_blueprint(core_bp)
config.py
from decouple import config DATABASE_URI = config("DATABASE_URL") if DATABASE_URI.startswith("postgres://"): DATABASE_URI = DATABASE_URI.replace("postgres://", "postgresql://", 1) class Config(object): DEBUG = False TESTING = False CSRF_ENABLED = True SECRET_KEY = config("SECRET_KEY", default="guess-me") SQLALCHEMY_DATABASE_URI = DATABASE_URI SQLALCHEMY_TRACK_MODIFICATIONS = False BCRYPT_LOG_ROUNDS = 13 WTF_CSRF_ENABLED = True DEBUG_TB_ENABLED = False DEBUG_TB_INTERCEPT_REDIRECTS = False class DevelopmentConfig(Config): DEVELOPMENT = True DEBUG = True WTF_CSRF_ENABLED = False DEBUG_TB_ENABLED = True class TestingConfig(Config): TESTING = True DEBUG = True SQLALCHEMY_DATABASE_URI = "sqlite:///testdb.sqlite" BCRYPT_LOG_ROUNDS = 1 WTF_CSRF_ENABLED = False class ProductionConfig(Config): DEBUG = False DEBUG_TB_ENABLED = False
问题原因与解决方法
直接修复bat文件
Windows的set命令不需要添加export关键字,set export XXX=XXX会把变量名设置为export,而非XXX,导致python-decouple无法读取到正确的环境变量。
修改后的env.bat内容:
set SECRET_KEY=34uqhtg3rfhjqwief3woqijj4ki324jkDEWGF set DEBUG=True set APP_SETTINGS=config.DevelopmentConfig set DATABASE_URL=sqlite:///db.sqlite set FLASK_APP=src set FLASK_DEBUG=1
修改后,双击运行env.bat(或在命令行中执行该文件),再启动manage.py即可。
更兼容的方案:直接使用.env文件
由于项目使用了python-decouple,该库默认会自动读取项目根目录下的.env文件,无需编写bat脚本,和Linux环境保持一致:
- 在项目根目录创建
.env文件,内容和Linux下的一致:
SECRET_KEY=34uqhtg3rfhjqwief3woqijj4ki324jkDEWGF DEBUG=True APP_SETTINGS=config.DevelopmentConfig DATABASE_URL=sqlite:///db.sqlite FLASK_APP=src FLASK_DEBUG=1
- 直接运行
manage.py即可,python-decouple会自动加载这些环境变量。
内容的提问来源于stack exchange,提问作者Tom John
相关产品推荐
相关产品推荐

