zoukankan      html  css  js  c++  java
  • 如何做好python项目的配置分离

    引用原地址:https://www.jianshu.com/p/aa6366b02c28

    本文内容:

    项目配置分离

    • 为什么要分离
    • 该怎么分离

    配置合并

    • 合并代码

    分离

    为什么要分离:

    为区分正式和开发而分离

     1.开发环境和生成环境应该使用不同的环境变量

    为了隔离敏感信息而分离

     1.数据库密码,账号token不应该存在代码里面

    为了方便程序员写代码分离

     1.独立公共的配置

    如何做分离

    代码目录结构

    config/
        __init__.py
        common.yml
        dev.yml
        prod.yml

     common.yml

    存放公共的配置

    authorize:
      { token: justtoken,
        expire_time: 1200,
        reset_password_expire_time: 2400
      }
    
    date_format: '%Y-%m-%d %H:%M:%S'
    • dev.yml

    存放开发环境配置

    db:
      {
        SQLALCHEMY_DATABASE_URI: "mysql+pymysql://admin@localhost:3306/test?charset=utf8mb4"
      }

        prod.yml

        存放正式环境的配置

    db:
      {
        SQLALCHEMY_DATABASE_URI: "mysql+pymysql://admin@xxx:3306/prod?charset=utf8mb4"
      }

    _init_.py 存放提取环境标量的代码

    export database_password="hello"
    

      合并

      合并的代码:

    import os
    import yaml
    env = os.environ.get('env', 'dev')
    
    
    def load_env(env_file_name):
        file = open(os.path.join(os.path.dirname(__file__), env_file_name), 'r', encoding='utf-8')
        cfg = yaml.safe_load(file)
        return cfg
    
    
    def merge_conf(base, to_be_merged):
        for i in to_be_merged.keys():
            base[i] = to_be_merged[i]
        return base
    
    
    def load_env_outside():
        env_conf = dict()
        env_conf['database_password'] = os.environ.get('database_password')
        return env_conf
    
    
    CONF = load_env('common.yml')
    
    if env == 'dev':
        dev_conf = load_env('dev.yml')
        CONF = merge_conf(CONF, dev_conf)
    elif env == 'prod':
        prod_conf = load_env('prod.yml')
        CONF = merge_conf(CONF, prod_conf)
        env_outside = load_env_outside()
        CONF = merge_conf(CONF, env_outside)
    else:
        raise EnvironmentError('Environment error')
    
    print(CONF)
    

    执行结果:

    {'authorize': {'token': 'justtoken', 'expire_time': 1200, 'reset_password_expire_time': 2400}, 'date_format': '%Y-%m-%d %H:%M:%S', 'db': {'SQLALCHEMY_DATABASE_URI': 'mysql+pymysql://admin@xxx:3306/prod?charset=utf8mb4'}, 'database_password': 'hello'}
    

      

     

  • 相关阅读:
    MySQL查询语句练习题
    Implicit declaration of function 'CC_MD5' is invalid in C99
    iOS中添加UITapGestureRecognizer手势识别后,UITableView的didSelectRowAtIndexPath失效
    Xcode删除Project上层group
    NavigationBar 背景颜色,字体颜色
    iOS xcode6.0使用7.1运行程序 iphone5上下有黑条
    ITMS-SERVICES://方式安装IPA在IOS 7.1中的变化
    iOS企业开发In House ipa发布流程
    ArcGIS Runtime SDK for iOS开发系列教程(5)——要素信息的绘制
    Linux C Socket编程原理及简单实例
  • 原文地址:https://www.cnblogs.com/hl-2030/p/14446435.html
Copyright © 2011-2022 走看看