Flask与Python读取配置文件属性时返回None的问题
我来帮你捋捋为什么读取不到配置内容——核心问题出在Flask加载配置文件的规则上,咱们一步步拆解:
1. 配置文件的语法不符合Python规范
Flask的app.config.from_pyfile()方法是把目标文件当作Python模块来执行的,所以文件里的内容必须是合法的Python代码。你写的myvar1="tester"虽然看起来像赋值,但严格来说不符合Python的常规语法(等号两边没有空格),虽然Python解释器能勉强解析,但有时候会因为文件编码、隐形字符等问题导致加载失败,更稳妥的写法是遵循Python的赋值规范:
myvar1 = "tester" myvar2 = "tester" myvar3 = "tester"
2. 路径验证(虽然你没报错,但还是确认下)
你设置了silent=False,如果配置文件路径错误,Flask会直接抛出异常,所以你没报错说明路径是对的,但还是要确认:运行Flask脚本的当前工作目录是项目根目录(也就是包含config文件夹的那个目录)。比如如果你的脚本在src/app.py里,那os.path.join('.', 'config/app.conf')会指向src/config/app.conf,而不是项目根目录的config/app.conf——不过你没报错的话这条应该没问题。
3. 关于from_pyfile的返回值
你把app.config.from_pyfile()的结果赋值给了my_config,但这个方法返回的是布尔值(加载成功返回True,失败返回False,仅当silent=True时),不是配置字典,所以my_config其实只是个成功标记,不是你要的配置内容,不过这不是你获取不到配置项的直接原因。
修正后的代码示例
先把config/app.conf改成标准Python赋值格式,然后可以调整代码如下:
from flask import Flask import os app = Flask(__name__) # 加载配置文件,可添加加载成功判断 config_loaded = app.config.from_pyfile(os.path.join('.', 'config/app.conf'), silent=False) if not config_loaded: raise RuntimeError("Failed to load configuration file") @app.route('/') def hello_world(): myvar1 = app.config.get('myvar1') logging_val = app.config.get('LOGGING') return f'Hello World! myvar1: {myvar1}, LOGGING: {logging_val}' if __name__ == '__main__': app.run()
如果之后你需要加载非Python格式的配置文件(比如.ini或.yaml),可以用对应的解析模块(比如configparser或pyyaml)读取后,再把配置项逐个添加到app.config里。
内容的提问来源于stack exchange,提问作者blue-sky

