Flask中如何将配置文件读取为字典?配置读取报错排查
Flask配置文件读取问题与解决方案
初始问题:读取配置得到字节类型而非字典
你一开始用app.open_instance_resource('app.cfg')读取配置,得到的是<class 'bytes'>,这是因为open_instance_resource默认以二进制模式打开文件,所以f.read()返回字节流。如果只是想转成字符串,可以用:
with app.open_instance_resource('app.cfg') as f: config_str = f.read().decode('utf-8') # 转成UTF-8字符串
但其实Flask已经提供了更便捷的配置加载方法,完全不需要自己手动读取解析文件,推荐使用内置的配置加载函数。
更新1:NameError: name 'tester' is not defined 错误分析
你用app.config.from_pyfile()加载api.conf时,这个方法会把配置文件当作Python代码执行。你的配置行myvar=tester里,tester没有加引号,Python会把它当成一个变量名,而不是字符串,所以抛出了未定义的错误。
解决方法:给字符串值加引号,修改api.conf为:
myvar='tester' # 或者双引号 myvar="tester"
更新2:ValueError: dictionary update sequence element #0 has length 1; 2 is required 错误分析
logging.config.dictConfig()要求传入一个字典类型的配置,但你把LOGGING设成了字符串"tester",这显然不符合要求。
正确的做法是在api.conf里定义符合日志配置规范的Python字典,比如:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'class': 'logging.StreamHandler', }, }, 'root': { 'handlers': ['console'], 'level': 'INFO', }, }
然后在app.py中直接使用:
from flask import Flask import os from logging.config import dictConfig app = Flask(__name__) # 加载配置文件 app.config.from_pyfile(os.path.join('.', 'conf/api.conf'), silent=True) logging_configuration = app.config.get('LOGGING') if logging_configuration: dictConfig(logging_configuration) # dictConfig无返回值,无需print @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run()
总结:Flask加载配置的正确姿势
- 优先使用Flask内置的
app.config.from_pyfile()、app.config.from_instance_config()等方法,它们会自动解析配置并将键值对存入app.config字典中。 - 配置文件的语法遵循Python代码规范,字符串要加引号,字典/列表等结构要符合Python语法。
- 如果需要加载实例文件夹中的配置(比如
/instance/app.cfg),可以直接用app.config.from_pyfile('app.cfg', silent=True),Flask会自动在实例目录中查找。
内容的提问来源于stack exchange,提问作者blue-sky
相关产品推荐
相关产品推荐

