在项目中,我们有时候需要读取配置文件,如:数据库连接信息等,下面介绍几种读取配置文件的方法

一 config.py(settings.py)

  1. 将配置文件直接写在Python文件中,配置文件(config.py 或 settings.py) 通常放置在项目的根目录,方便引用
  2. 这种方法非常简单,直接把配置的内容写到了代码中,在应用中直接进行引用。但是,它存在严重的安全问题。当然,当配置文件不包含敏感信息时,也可以采用这种简单的方法。

congfig.py

  1. host = "localhost"
  2. user = "root"
  3. password =""
  4. db = "sizechart_spider"
  5. port = 3306
  6. charset = "utf8"

readconfig.py

  1. # 引入模块
  2. import config
  3. if __name__ == '__main__':
  4. db = pymysql.connect(host=config.host,
  5. user=config.user,
  6. passwd=config.password,
  7. db=config.db, # 数据库名字
  8. port=config.port,
  9. charset=config.charset)

二 config.ini

  1. 更常见的配置管理方法就是利用外部的配置文件,让配置文件仅仅包含配置信息,和代码独立开来,不直接引用也就不需要写成python代码。通常使用json、yaml或者ini的文件格式来存储配置。
  2. 使用标准库中的configparser模块读取.ini格式的配置文件。

config.ini

  1. [mysql]
  2. host = localhost
  3. user = root
  4. password =
  5. db = sizechart_spider
  6. port = 3306
  7. charset = utf8

readconfig.py

  1. import configparser
  2. import os
  3. class ReadConfig:
  4. """读取配置文件类"""
  5. def __init__(self,filepath=None):
  6. if filepath:
  7. configpath =filepath
  8. else:
  9. root_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
  10. configpath = os.path.join(root_dir, 'config.ini')
  11. print(configpath)
  12. self.cf = configparser.ConfigParser()
  13. self.cf.read(configpath, encoding="utf-8")
  14. def get_db(self, param):
  15. return self.cf.get('mysql', param)

测试:

  1. if __name__ == '__main__':
  2. cf = ReadConfig() # 当不传参数时,默认是根目录下面的config.ini文件
  3. # 传参数
  4. # cf = ReadConfig(r"D:\codeProject\pythonProject\pythonStudy\config\dev.ini")
  5. t = cf.get_db("host")
  6. print(t) # localhost

三 Dynaconf

  1. Dynaconf 是一个库,旨在成为在 Python中管理配置的最佳选择。
  2. 它可以从各种来源读取设置,包括环境变量、文件、服务器配置等。
  3. 它适用于任何类型的 Python 程序,包括 Flask 和 Django 扩展。

1. 安装

  1. pip install dynaconf

2. 初始化项目

  1. cd 项目根目录
  2. # 推荐使用toml格式配置文件,django推荐yaml格式(toml|yaml|yml|json|ini|py|env)
  3. dynaconf init -f toml

项目初始化后,会生成以下文件:

  1. ├── config.py # 需要被导入的配置脚本
  2. ├── .secrets.toml # 像密码等敏感信息配置
  3. └── settings.toml # 应用配置

settings.toml

  1. [mysql]
  2. host = "localhost"
  3. user = "root"
  4. password =""
  5. db = "sizechart_spider"
  6. port = 3306
  7. charset = "utf8"

.secrets.toml

  1. password = "s3cr3t"
  2. token = "dfgrfg5d4g56ds4gsdf5g74984we5345-"

config.py

  1. from dynaconf import Dynaconf
  2. settings = Dynaconf(
  3. envvar_prefix="DYNACONF",
  4. settings_files=['settings.toml', '.secrets.toml'],
  5. )
  6. # `envvar_prefix` = export envvars with `export DYNACONF_FOO=bar`.
  7. # `settings_files` = Load this files in the order.

3. 项目中使用

Dynaconf settings是一个类似字典的对象,它提供了多种访问变量的方法

  1. from config import settings
  2. if __name__ == '__main__':
  3. # settings.toml
  4. # 方式一
  5. print(settings.mysql.db)
  6. # 方式二
  7. print(settings.get('mysql.db'))
  8. # 方式三
  9. print(settings['mysql.db'])
  10. # 获取.secrets.toml
  11. print(settings.password)

4. 动态加载不同配置

针对不同环境使用不同的配置文件

方式一:根据settings.toml的section分层

  1. settin__gs.toml 文件根据section分层 ```python [test] password = “test”

[development] password = “development”

[production] password = “production”

  1. 2. 修改**_config.py_**
  2. 原来的:
  3. ```python
  4. settings = Dynaconf(
  5. envvar_prefix="DYNACONF",
  6. settings_files=['settings.toml', '.secrets.toml'],
  7. )

修改后的:

settings = Dynaconf(
    environments = True,    # 新增 表示可以根据环境变量来加载项目配置。
    env = "development",    # 新增 表示默认使用settings.toml文件中的development
    envvar_prefix="DYNACONF",
    settings_files=['settings.toml', '.secrets.toml'],
)
  1. 项目中使用 ```python from config import settings

if name == ‘main‘: print(settings.password) # development

<a name="gKSXz"></a>
## 方式二:设置环境变量加载不同配置

1. **_settin__gs.toml _**
```python
[test]
password = "test"

[development]
password = "development"

[production]
password = "production"
  1. 修改config.py

原来的:

settings = Dynaconf(
    envvar_prefix="DYNACONF",
    settings_files=['settings.toml', '.secrets.toml'],
)

修改后的:

settings = Dynaconf(
    environments = True,    # 新增 表示可以根据环境变量来加载项目配置。
    envvar_prefix="DYNACONF",
    settings_files=['settings.toml', '.secrets.toml'],
)
  1. 项目中使用 ```python from config import settings import os

os.environ[‘ENV_FOR_DYNACONF’] = ‘test’

if name == ‘main‘: print(settings.password) # test


---

也可以将设置环境变量的代码封装进一个Python文件中<br />**_utils/set_environ.py_**
```python
import os

os.environ['ENV_FOR_DYNACONF'] = 'production'

然后在项目中的使用:

from config import settings
from utils import set_environ    # 即使不使用也要引用


if __name__ == '__main__':
    print(settings.password)    # production