1

2

3

4

5

6

7

8

9

10

11

12

import os

import configparser

try:

CONFIG_PATH= os.environ['CONFIG_PATH']

except Exception:

raise ValueError

config= configparser.ConfigParser()

config.read(CONFIG_PATH)

host= config["DATABASE"]["HOST"]

3. 直接使用系统环境变量读取配置

此方法不使用文件来存储配置信息,将所有的配置信息存储到环境变量中,在实践中也比较常见,运维通过ansible部署脚本,在程序运行前将需要配置信息导入到环境变量中。

1

2

3

4

5

6

7

8

import os

secret_key= os.environ.get('SECRET_KEY',None)

if not secret_key:

raise ValueError('You must have "SECRET_KEY" variable')

app.config['SECRET_KEY']= secert_key

不利用文件存储,在一定程度上加强了对密码等配置信息的保护,但也增加了运维的工作量,尤其当需要修改配置的时候。

4. Dynaconf:Pyhton项目的动态配置

上面介绍了三种常见的项目配置方法,最有介绍一个好用的python动态项目配置库:Dynaconf。dyanconf是OSM(Object Settings Mapper), 能够从不同的配置数据存储方式中读取配置,例如python配置文件、系统环境变量、redis、ini文件、json文件等等。

安装:pip install dynaconf

使用方式:

1

2

3

4

from dynaconfimport settings

print(settings.SOME_VARIABLE)

or

print(settings.get('SOME_VARIABLE'))

如果不希望配置跟随项目,可以通过系统环境变量来指定配置文件的位置

1

2

3

4

# using module name

export DYNACONF_SETTINGS=myproject.production_settings

# or using location path

export DYNACONF_SETTINGS=/etc/myprogram/settings.py

4.1 dyanconf读取系统环境变量中的配置

当我们部署的程序需要读取一个MYSQL_HOST的配置用于测试,不需要去重写配置文件,仅需要再系统环境变量中加入:

export DYNACONF_MYSQL_HOST=myserver.com

然后,程序便可以获取到该配置:

>>> from dynaconf import settings

>>> print(settings.MYSQL_HOST)

myserver.com

如果需要指定配置值的数值类型,则通过以下方式增加对应的系统环境变量:

1

2

3

4

5

6

export DYNACONF_NUMBER='@int 123'

export DYNACONF_FLOAT='@float 12.2'

export DYNACONF_FLAG='@bool yes'

export DYNACONF_FLAG2='@bool disabled'

export DYNACONF_LIST='@json [1, 2, 3, 4]'

export DYNACONF_DICT='@json {"name": "Bruno"}'

读取到的配置如下所示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

from dynaconfimport settings

type(settings.NUMBER)

int

type(settings.FLOAT)

float

type(settings.FLAG)

bool

print(settings.FLAG2== False)

True

print(settings.LIST[1])

2

print(settings.DICT['name'])

Bruno

4.2 通过redis存储配置

我们也可以讲配置文件存储到redis中,达到在对不同的机器共享环境变量的效果,仅需要在settings.py文件中增加一下代码:

1

2

3

4

5

6

7

8

9

10

11

12

# connection

REDIS_FOR_DYNACONF= {

'host':'localhost',

'port':6379,

'db':0

}

# and loader

LOADERS_FOR_DYNACONF= [

'dynaconf.loaders.env_loader',

'dynaconf.loaders.redis_loader' # 增加了redis的加载

]

现在可以讲配置存储到redis中,hash默认为DYNACONF_DYNACONF。dyanconf还提供了方法去将配置写入到redis:

1

2

3

4

from dynaconf.utilsimport redis_writer

from dynaconfimport settings

redis_writer.write(settings,name='test',mysql_host='localhost', MYSQL_PORT=3306)

查看Redis,存储的结果如下:

1

2

3

4

DYNACONF_DYNACONF:

NAME='test'

MYSQL_HOST='localhost'

PORT='@int 3306'

至此,python项目常见的配置方法总结完毕,不过在一些微服务架构中,会专门开发配置中心,程序直接从线上读取配置,配置的管理也会开发一套GUI,方便开发和运维。

python配置文件读取环境变量_转载:Python项目读取配置的几种方式相关推荐

  1. python设置环境变量_小白Python进行中

    一.安装 安装包的下载 在官网进行下载,我选用Python3.8.0. Welcome to Python.org​www.python.org 安装 安装的时候可以借鉴该视频. Windows 10 ...

  2. python怎么设置环境变量_百度经验_如何在Python中设置环境变量

    sisanared.. 49 os.environ行为类似于python字典,因此可以执行所有常见的字典操作.除了其他答案中提到的get和set操作之外,我们还可以简单地检查是否存在密钥 Python ...

  3. python脚本设置环境变量_详解如何设置Python环境变量?

    家好,我是Yivies!相信大家多多少少遇到过这样的情况吧?就是在安装了python之后想完整在命令提示符直接输入python就可以使用的操作,但是会出现输入了python之后找不到命令的情况!例如这 ...

  4. python中读取文件编码_[转载]python中使用文件的读取编码问题

    原文链接:https://www.cnblogs.com/qianboping/p/6524420.html 今天想写个程序合并文件的,以前一直觉得python的编码解码好烦,只要处理文件合并之类的都 ...

  5. python打印多个变量_在Python中打印多个变量

    python打印多个变量 Like other programming languages, In python also, we can define and print the multiple ...

  6. 添加java环境变量_【安装 JDK】 配置环境变量

    看完这章后你会学习到以下内容: WIN64位电脑,如何配置JAVA环境? 常见的问题要如何解决? 第一步: 在任意浏览器输入"JDK下载"并找到官网 第二步:进入选择所需要的版本. ...

  7. 安装java 并配置环境变量_安装Java JDK并配置环境变量

    学习JAVA,必须得安装一下JDK(java development kit java开发工具包),配置一下环境就可以学习JAVA了,下面是下载和安装JDK的教程: 点开链接你应该看到如下图所示的界面 ...

  8. macbook配置java环境变量_如何安装Java和配置环境变量

    本文是Java下载.安装.环境变量配置的具体步骤,关于环境变量的原理参阅: Java轻松入门经典教程-环境变量配置​ke.qq.com Java年构架师技术栈/微服务/源码分析/分布式/高并发/性能优 ...

  9. python代码读取外部变量_在Python中从外部文件中写入和读取特定的变量

    我正在写一个程序,在这个程序中,我想在外部文件中读写具有不同数据类型的特定变量. 在尝试了几个不同的模块后,我得到的最接近的方法是使用pickle. Pickle似乎很好,因为它能理解不同的数据类型, ...

  10. python代码读取外部变量_关于python闭包的问题,内部函数可以获取外部函数的变量吗?...

    def lazy_sum(*args): ax = 0 def sum(): for n in args: ax = ax + n        return ax    return sum f = ...

最新文章

  1. iphone如何信任软件_你还在用大众点评吗?评价软件失去信任还如何活下去
  2. IOS入门-TargetAction
  3. 项目实战12.1—企业级监控工具应用实战-zabbix安装与基础操作
  4. 因主机名更改造成oracle控制台登录错误:ora-12545,ora-12541
  5. python创建项目包
  6. ajax中datatype是json,dataType:'json'vs data:$ .ajax中的JSON.stringify(obj)
  7. android 生成泛型对象,java android解析多层含有泛型对象的json数据获取不到泛型类型解析失败解决办法...
  8. python转换窗口无响应_Tkinter窗口显示(没有响应),但代码正在运行
  9. Express-start
  10. 轻量级 Lock Free 线程安全的 QueueT 的C#2.0实现
  11. android中xmlns的作用
  12. mes选型与实施指南_六大类型MES企业大盘点告诉你如何选择正确选择MES
  13. matlab求滤波器的相频特性,matlab仿真一阶低通滤波器幅频特性和相频特性.docx
  14. 高校邦后台挂课答题助手可后台可多开可答题
  15. [转]如何在NIOS II中读写EPCS剩余空间
  16. linux修改IP地址的命令
  17. linux ubuntu git报错fatal: unsafe repository git config --global --add safe.directory解决方案
  18. 关于技术人员的非技术能力
  19. 苹果“教主”乔布斯:一个人的世界
  20. 微软又发布了一款命令行神器,功能非常强大!

热门文章

  1. MySQL的timeout那点事
  2. HAProxy + Keepalived实现MySQL的高可用负载均衡
  3. php无框架开发web项目,web.framework
  4. php如何去重,php二维数组如何去重?(代码示例)
  5. 入门React第二天(函数式组件传值)
  6. C# 计算程序运行耗时的方法
  7. golang 微信小程序获取二维码scene参数报错 invalid scene rid: f05f96ab-5382f139-14b13d2f
  8. android alertdialog 自定义时间,Android自定义dialog可选择展示年月日时间选择栏
  9. 梦到两个人辞职,一男一女
  10. 全网首发:FreeSwitch BANNER支持中文