将密码存储在单独的文件中
存储Python脚本中的应用程序秘密(比如密码、访问令牌)最简单的方法是什么?我原以为可以用一个*.yml
文件,就像在Ruby中那样,但让我惊讶的是,事实并不是这样。那么,应该用什么呢?最简单的解决方案是什么?
我想把这些秘密放在一个单独的文件里,这样我就可以不把这个文件上传到GitHub仓库。
4 个回答
可能我来得有点晚,但我还是想分享一种我觉得更简单的方法,而且不需要太多编码。
可以使用ini文件来存储你的秘密,像这样:
[section_name]
key1 = value1
key2 = value2
然后使用configparser这个库来读取ini文件,并从中提取不同的值。
除此之外,如果你只有几个变量需要处理,我觉得使用.env文件也可以。
在以上两种方法中,你可以通过在.gitignore文件中添加*.ini或*.env,确保你的秘密不会被意外上传到github上。
我个人比较喜欢用yaml文件,配合pyyaml这个库来使用。你可以在这里找到相关的文档:https://pyyaml.org/wiki/PyYAMLDocumentation
创建一个.gitignore
规则非常简单,而且几乎不可能出错。在Linux或类似UNIX的系统中,你可以用echo命令快速添加这个规则:
echo -e '*.yaml\n*.yml' >> .gitignore
下面是一个从同一文件夹里的设置.yaml文件中获取设置的例子。
代码片段:
#!/usr/bin/env python3
import yaml
from pathlib import Path
def get_settings():
full_file_path = Path(__file__).parent.joinpath('settings.yaml')
with open(full_file_path) as settings:
settings_data = yaml.load(settings, Loader=yaml.Loader)
return settings_data
我之前也遇到过同样的问题,最后找到的解决办法和kecer提到的一样。因为我需要在很多脚本中使用这个方法,所以我自己创建了一个库。让我和你分享这个解决方案。
credlib.py -- 一个通用的库,用来处理凭证
class credential:
def __init__(self, hostname, username, password):
self.hostname = hostname
self.username = username
self.password = password
mycredentials.py -- 我本地的文件,用来存储所有的凭证
from credlib import credential
sys_prod = credential("srv01", "user", "pass")
sys_stg = credential("srv02", "user", "pass")
sys_db = credential("db01", "userdb", "passdb")
mysystemlib.py -- 这是一个通用库,用来访问我的系统(支持新的凭证系统和旧的系统)
from credlib import credential
def system_login(*args): # this is new function definition
#def system_login(hostname, username, password): # this was previous function definition
if len(args) == 1 and isinstance(args[0], credential):
hostname = args[0].hostname
username = args[0].username
password = args[0].password
elif len(args) == 3:
hostname = args[0]
username = args[1]
password = args[2]
else:
raise ValueError('Invalid arguments')
do_login(hostname, username, password) # this is original system login call
main.py -- 主要的脚本,结合了凭证和系统库
from mycredentials import sys_stg, sys_db
import mysystemlib
...
mysystemlib.system_login(sys_stg)
请注意,旧的主机名/用户名/密码的方式仍然可以使用,所以不会影响旧的脚本:
mysystemlib.system_login("srv02", "user", "pass")
这个方法有很多好处:
- 在我们所有的Python脚本中使用相同的凭证系统
- 存放密码的文件是分开的(这些文件可以设置更严格的权限)
- 文件不存储在我们的git仓库中(通过
.gitignore
排除),这样我们的Python脚本/库可以和别人分享,而不暴露凭证(每个人在自己的本地文件中定义自己的凭证) - 如果需要更改密码,我们只需在一个地方进行更改
我觉得把账号密码放在另一个 *py 文件里是最安全的做法。然后你只需要把这个文件导入就可以了。下面是一个例子:
config.py
username = "xy"
password = "abcd"
main.py
import config
login(config.username, config.password)