为什么要用yaml格式的文件
方便以后对配置文件的修改以及读取不同的配置内容,而不是在代码中修改配置信息
什么是yaml文件?
YAML是一种直观的能够被电脑识别的的数据序列化格式,容易被人类阅读,并且容易和脚本语言交互。YAML类似于XML,JSON等,但是语法简单得多,对于转化成数组或可以hash的数据时是很简单有效的
如何编写yaml文件?
# yaml格式
name: 张三
age: 37
children:
- name: 小明
age: 15
- name: 小红
age: 12
上面这段代码在python中具体输出如下:
{
'name': '张三', 'age': 37,
'children': [{'name': '小明', 'age': 15}, {'name': '小红', 'age': 12}]
}
从上面可以看出,通过yaml文件的简单书写,便能转换为python中的字典以及列表字典。
yaml编写规则:https://blog.csdn.net/vincent_hbl/article/details/75411243
Flask加载yaml配置文件
创建虚拟环境,启用虚拟环境
安装PyYAML pip install PyYAML
安装Flask pip install Flask
from flask import Flask
import yaml
# 编写读取yaml文件函数(read_yaml)
def read_yaml(yaml_file_path):
with open(yaml_file_path, 'rb') as f:
cf= yaml.safe_load(f.read()) # yaml.load(f.read())
return cf
app = Flask(__name__)
# flask加载yaml文件配置
cf = read_yaml("xxx.yaml")
app.config.update(cf)
if __name__ == "__main__":
app.run()
工厂模式
- 文件目录
-----app
│ │
│ factoty.py
-----config
| |
| config.yaml
run.py
- 配置文件(config.yaml)
COMMON: &common #标识
DEBUG: False
SECRET_KEY: insecure
DEVELOPMENT: &development
<<: *common # 继承common,没有重新定义的变量,使用common变量值
DEBUG: True
STAGING: &staging
<<: *common
SECRET_KEY: sortasecure
PRODUCTION: &production
<<: *common
SECRET_KEY: mdd1##$$%^!DSA#FDSF
- 工厂文件(factory.py)
import yaml
import os
from flask import Flask
def create_app(config_name=None, config_path=None):
app = Flask(__name__)
# 读取配置文件
if not config_path:
pwd = os.getcwd()
config_path = os.path.join(pwd, 'config/config.yaml')
if not config_name:
config_name = 'PRODUCTION'
conf = read_yaml(config_name, config_path)
app.config.update(conf)
return app
def read_yaml(config_name,config_path):
"""
config_name:需要读取的配置内容
config_path:配置文件路径
"""
if config_name and config_path:
with open(config_path, 'r') as f:
conf = yaml.safe_load(f.read()) # yaml.load(f.read())
if config_name in conf.keys():
return conf[config_name.upper()]
else:
raise KeyError('未找到对应的配置信息')
else:
raise ValueError('请输入正确的配置名称或配置文件路径')
- 运行文件(run.py)
from app import factory
app = factory.create_app(config_name='DEVELOPMENT')
if __name__ == "__main__":
app.run()
网友评论