[python-flask笔记1]python加载配置的五种方式

  • 1配置对象
  • 2配置文件
  • 3环境变量,执行的时候设置环境变量
  • 4使用yaml包,实现“字典”方式配置参数
  • 5使用yaml+argparse+命名空间,实现“命名空间”方式配置参数

项目中一般使用 1 , 3 种 第一种:一般存储业务相关信息,如数据库配置,连接信息,各种初始化信息 第三种:密钥
签名等信息放在环境变量, 一般不跟业务代码放在一起

前三种结合flask进行测试:
第三种需要添加环境变量, key是SET_config ,value是路径。

[python-flask笔记1]python加载配置的五种方式_第1张图片[python-flask笔记1]python加载配置的五种方式_第2张图片

from flask import Flask

#配置文件加载
# 从配置对象/文件加载,从环境变量中加载

#1.从对象中加载config DefaultConfig,也可以新建一个配置对象的py文件
class DefaultConfig(object):
   MYSQL_URL = 'mysql address'

# 2.从配置文件中加载from_pyfile
# 3.可以加载非py文件from_envvar
app = Flask(__name__)
app.config.from_object(DefaultConfig)
app.config.from_pyfile('settings.py')
app.config.from_pyfile('env.ini')
# silent=True表示沉默,加载不到不报错;false表示不沉默,加载不到报错
app.config.from_envvar('SET_config',silent=True)
@app.route("/")
def index():
    # config是flask中自带的配置对象,保存了程序的配置信息
    print(app.config.get('MYSQL_URL'))
    print(app.config.get('SECRET_KEY'))
    # 在这里测试发现了一个问题,就是配置的名字都是大写的
    print(app.config.get('SECRET_KEY_INI'))
    print(app.config.get('SECRET_KEY_ENV'))
    return 'hello word'

if __name__ == '__main__':
    app.run()

第四种和第五种方法的参考地址:
https://zhuanlan.zhihu.com/p/421415795

第四种:
a.yaml是当前工作路径下的yaml文件

import os
import yaml

......
......

filepath = os.path.join(os.getcwd(),'a.yaml')   # 文件路径,这里需要将a.yaml文件与本程序文件放在同级目录下
    with open(filepath,'r') as f:   # 用with读取文件更好
        configs = yaml.load(f, Loader=yaml.FullLoader) # 按字典格式读取并返回
        # 显示读取后的内容
        print(type(configs))  # 

第五种:

# -*- coding: utf-8 -*-
import os
import yaml
import argparse

......
......

def dict2namespace(config):
    #声明命名空间
    namespace = argparse.Namespace()
    for key, value in config.items():
        if isinstance(value, dict):
            new_value = dict2namespace(value)
        else:
            new_value = value
        #将参数对添加到命名空间中
        setattr(namespace, key, new_value)
    return namespace

def test_argparse():
    parser = argparse.ArgumentParser()
    parser.add_argument('--cfg',type = str,default=r"a.yaml",help="...") 
    args = parser.parse_args()
    filepath = os.path.join(os.getcwd(), args.cfg)

    with open(filepath, 'r') as f:
        config = yaml.load(f, Loader=yaml.FullLoader)

    configs = dict2namespace({**config, **vars(args)})
    # 测试输出
    print(type(configs))                    #
    print(configs.model)                    
    print(configs.stage1)                   #Namespace(banchsize=32, number=3)
    print(configs.stage1.number)            #3
    print(configs.model)                    
    print(configs.model.level3.layernumber) #50
    print(configs.loggfile)                 #loggle.log

a.yaml

stage1:
  number: 3
  banchsize: 32
model:
  level1:
    name: "cnn"
    layernumber: 4
  level2:
    name: "lstm"
    layernumber: 12
  level3:
    name: "resnet50"
    layernumber: 50
    layernormal: True
loggfile: "loggle.log"
loggstatus: 'yes'

你可能感兴趣的:(#,Python,python,flask,开发语言)