在项目中,我们有时候需要读取配置文件,如:数据库连接信息等,下面介绍几种读取配置文件的方法
一 config.py(settings.py)
- 将配置文件直接写在Python文件中,配置文件(config.py 或 settings.py) 通常放置在项目的根目录,方便引用
- 这种方法非常简单,直接把配置的内容写到了代码中,在应用中直接进行引用。但是,它存在严重的安全问题。当然,当配置文件不包含敏感信息时,也可以采用这种简单的方法。
congfig.py
host = "localhost"
user = "root"
password =""
db = "sizechart_spider"
port = 3306
charset = "utf8"
readconfig.py
# 引入模块
import config
if __name__ == '__main__':
db = pymysql.connect(host=config.host,
user=config.user,
passwd=config.password,
db=config.db, # 数据库名字
port=config.port,
charset=config.charset)
二 config.ini
- 更常见的配置管理方法就是利用外部的配置文件,让配置文件仅仅包含配置信息,和代码独立开来,不直接引用也就不需要写成python代码。通常使用json、yaml或者ini的文件格式来存储配置。
- 使用标准库中的configparser模块读取.ini格式的配置文件。
config.ini
[mysql]
host = localhost
user = root
password =
db = sizechart_spider
port = 3306
charset = utf8
readconfig.py
import configparser
import os
class ReadConfig:
"""读取配置文件类"""
def __init__(self,filepath=None):
if filepath:
configpath =filepath
else:
root_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
configpath = os.path.join(root_dir, 'config.ini')
print(configpath)
self.cf = configparser.ConfigParser()
self.cf.read(configpath, encoding="utf-8")
def get_db(self, param):
return self.cf.get('mysql', param)
测试:
if __name__ == '__main__':
cf = ReadConfig() # 当不传参数时,默认是根目录下面的config.ini文件
# 传参数
# cf = ReadConfig(r"D:\codeProject\pythonProject\pythonStudy\config\dev.ini")
t = cf.get_db("host")
print(t) # localhost
三 Dynaconf
- Dynaconf 是一个库,旨在成为在 Python中管理配置的最佳选择。
- 它可以从各种来源读取设置,包括环境变量、文件、服务器配置等。
- 它适用于任何类型的 Python 程序,包括 Flask 和 Django 扩展。
1. 安装
pip install dynaconf
2. 初始化项目
cd 项目根目录
# 推荐使用toml格式配置文件,django推荐yaml格式(toml|yaml|yml|json|ini|py|env)
dynaconf init -f toml
项目初始化后,会生成以下文件:
├── config.py # 需要被导入的配置脚本
├── .secrets.toml # 像密码等敏感信息配置
└── settings.toml # 应用配置
settings.toml
[mysql]
host = "localhost"
user = "root"
password =""
db = "sizechart_spider"
port = 3306
charset = "utf8"
.secrets.toml
password = "s3cr3t"
token = "dfgrfg5d4g56ds4gsdf5g74984we5345-"
config.py
from dynaconf import Dynaconf
settings = Dynaconf(
envvar_prefix="DYNACONF",
settings_files=['settings.toml', '.secrets.toml'],
)
# `envvar_prefix` = export envvars with `export DYNACONF_FOO=bar`.
# `settings_files` = Load this files in the order.
3. 项目中使用
Dynaconf settings是一个类似字典的对象,它提供了多种访问变量的方法
from config import settings
if __name__ == '__main__':
# settings.toml
# 方式一
print(settings.mysql.db)
# 方式二
print(settings.get('mysql.db'))
# 方式三
print(settings['mysql.db'])
# 获取.secrets.toml
print(settings.password)
4. 动态加载不同配置
针对不同环境使用不同的配置文件
方式一:根据settings.toml的section分层
- settin__gs.toml 文件根据section分层 ```python [test] password = “test”
[development] password = “development”
[production] password = “production”
2. 修改**_config.py_**
原来的:
```python
settings = Dynaconf(
envvar_prefix="DYNACONF",
settings_files=['settings.toml', '.secrets.toml'],
)
修改后的:
settings = Dynaconf(
environments = True, # 新增 表示可以根据环境变量来加载项目配置。
env = "development", # 新增 表示默认使用settings.toml文件中的development
envvar_prefix="DYNACONF",
settings_files=['settings.toml', '.secrets.toml'],
)
- 项目中使用 ```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"
- 修改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'],
)
- 项目中使用 ```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