正确做法是用os.environ.get('FLASK_CONFIG', 'development')动态加载config.py中对应配置类,优先级高于config.py;敏感字段如SECRET_KEY、DATABASE_URI须由环境变量提供并妥善转义,Flask 2.1+推荐使用from_prefixed_env()。

Flask怎么从config.py读配置又不硬编码环境名
靠手动改app.config.from_object()里的类名,上线就容易配错。正确做法是让Flask自己猜环境——用os.environ.get('FLASK_ENV', 'development')或更推荐的os.environ.get('FLASK_CONFIG', 'development')作为键,去config.py里找对应类。
常见错误:直接写app.config.from_object('config.DevelopmentConfig'),导致测试服跑着开发配置;或者把FLASK_ENV=production当真(Flask 2.3+已弃用该变量,只影响调试模式,不控制配置加载)。
-
config.py里每个配置类必须继承object,不能空继承dict或别的基类 - 类名不用和环境变量值严格一致,但建议统一小写,比如
ProductionConfig对应FLASK_CONFIG=production - 加载前务必检查环境变量是否存在,否则
from_object会抛ImportError,不是KeyError
环境变量和config.py冲突时谁优先
环境变量优先级更高——不是覆盖,而是“后加载覆盖先加载”。典型做法是先from_object加载config.py里的基础配置,再from_prefixed_env()(Flask 2.1+)或手动app.config.update()注入环境变量。
容易踩的坑:用os.environ直接覆盖SECRET_KEY这类敏感项时,没做类型转换。比如os.environ.get('MAX_CONTENT_LENGTH')返回字符串,但Flask要求整型,不转就报TypeError: 'str' object cannot be interpreted as an integer。
立即学习“Python免费学习笔记(深入)”;
- 敏感字段如
SECRET_KEY、SQLALCHEMY_DATABASE_URI必须由环境变量提供,绝不能写死在config.py - 非敏感字段如
JSON_SORT_KEYS = False可以保留在config.py,减少部署时环境变量数量 - Flask 2.1+支持
app.config.from_prefixed_env('MYAPP'),自动加载MYAPP_SECRET_KEY、MYAPP_DEBUG等,避免污染全局os.environ
config.py里怎么安全写数据库URI而不暴露密码
别拼接字符串。用urllib.parse.urlparse和urlunparse拆解再组装,把密码段替换成os.environ.get('DB_PASSWORD')。否则git误提交、日志打印、异常回溯都可能泄露。
常见错误现象:sqlalchemy.exc.ArgumentError: Could not parse rfc 1738 URL from string,基本是因为密码含@、/、:等特殊字符没做quote()处理。
- 必须对
DB_PASSWORD调用urllib.parse.quote_plus(password, safe=''),否则连接失败 - 本地开发可用
sqlite:///./app.db,但config.py里要显式写SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 'sqlite:///./app.db' - PostgreSQL推荐用
psycopg2-binary,但它的URI解析对空格和括号更敏感,务必用quote_plus
为什么flask run不读.env文件,而python app.py可以
因为flask run默认只加载.flaskenv(用于FLASK_*前缀变量),不加载通用.env。这是Flask CLI的设计选择,不是bug。
实际场景中,你既想用flask run又想共享DB_PASSWORD等非FLASK_*变量,就得额外装python-dotenv并手动触发加载。
- 在
app.py最顶部加from flask.cli import load_dotenv; load_dotenv(),它会自动找.env和.flaskenv - 不要用
dotenv.load_dotenv()(来自python-dotenv原生API),它不识别.flaskenv - 如果用了Docker,
.env文件不会自动进容器,必须显式copy或用env_file:指令
最麻烦的点其实是顺序:环境变量读取、.env加载、config.py导入、from_object执行——这四步缺一不可,任意一步漏掉或颠倒,配置就静默失效。调试时别只盯app.config打印结果,要逐层确认来源。










