允许用户为 python 包保存他们的第 3 方 API 密钥的最佳方式
The best way to allow users to save their 3rd party API keys for python package
我正在制作一个 python 包,我想通过 pipy 分发它作为需要 api-key 的第三方服务的包装器。我希望用户使用他们自己的(我的测试密钥在我的代码中是 而不是 )但我不知道让他们提供它以便于使用的最佳方式。
我看过 this answer 关于 .env 变量以及代码内 api 键访问的想法。
我的代码中有第二个选项:
from package import class
instance = class(api_key='blablablabla')
instance.do_stuff()
和
$ package do_stuff --api_key blablablabla --variable2 lalalala
这对于简单的脚本来说很好,很漂亮,但是用户无法推送他们的代码。我怎样才能创建一个全局可访问的变量,它没有安全风险并且可以在命令行和开发人员环境中工作?
例如:
$ package do_stuff --api_key blablablabla --variable2 lalalala
进入
$ package do_stuff --variable2 lalalala
和
from package import class
instance = class(api_key='blablablabla')
instance.do_stuff()
进入
from package import class, get_secret
get_secret('{global .env file}')
instance = class()
instance.do_stuff()
我的想法是:
- 如果用户想使用全局变量(但我担心跨平台问题),请让用户在终端中进行设置阶段
- 为每个 python 环境(放入 python 路径)python 制作一段 python 代码
- 让他们在每个每个根目录中保存一个文件,项目可能会在其中使用这个包(这对我来说似乎很糟糕)
有没有我遗漏的选项?我如何将这些选项嵌入到 python 包中?
备注:
假设我的包具有结构:
- /root
- license.txt
- pyproject.toml
- readme.md
- setup.cfg
- setup.py
- /function_name
- file.py
- __init__.py
- /tests
- __init__.py
- file_test.py
其中 file.py 包含命令行工具和日常开发功能的所有信息。
您可以在顶级目录中创建 config.ini_sample
(并将其推送到您的 VCS):
[DEFAULT]
api_key = <API_KEY>
不用说,您可以从脚本创建这样的文件,或者让用户自己从文档中复制它。
然后用户必须创建一个名为 config.ini
的文件的副本并填写 <API_KEY>
然后你可以像这样使用内置 configparser
, but I would recommend using configobj
:
from configobj import ConfigObj
from package import class
config = ConfigObj("config.ini")
api_key = config["DEFAULT"].get("API_KEY")
instance = class(api_key=api_key)
instance.do_stuff()
configobj
将在专利目录中搜索 config.ini
,因此即使您的项目中有其他目录,它也可以使用。
如果你使用git,那么只需将config.ini
添加到.gitignore
并且不用担心推送秘密数据,只有config.ini_sample
,但不要忘记保持 config.ini_sample
和 config.ini
同步,这样就不会出现 config.ini
而不是 config.ini_sample
.
的配置
根据我的观点和所做的研究,这是最好的方法,但其他选择是:
- 使用环境变量
- 要有一个
config.py
文件,其中定义了值
我正在制作一个 python 包,我想通过 pipy 分发它作为需要 api-key 的第三方服务的包装器。我希望用户使用他们自己的(我的测试密钥在我的代码中是 而不是 )但我不知道让他们提供它以便于使用的最佳方式。
我看过 this answer 关于 .env 变量以及代码内 api 键访问的想法。 我的代码中有第二个选项:
from package import class
instance = class(api_key='blablablabla')
instance.do_stuff()
和
$ package do_stuff --api_key blablablabla --variable2 lalalala
这对于简单的脚本来说很好,很漂亮,但是用户无法推送他们的代码。我怎样才能创建一个全局可访问的变量,它没有安全风险并且可以在命令行和开发人员环境中工作?
例如:
$ package do_stuff --api_key blablablabla --variable2 lalalala
进入
$ package do_stuff --variable2 lalalala
和
from package import class
instance = class(api_key='blablablabla')
instance.do_stuff()
进入
from package import class, get_secret
get_secret('{global .env file}')
instance = class()
instance.do_stuff()
我的想法是:
- 如果用户想使用全局变量(但我担心跨平台问题),请让用户在终端中进行设置阶段
- 为每个 python 环境(放入 python 路径)python 制作一段 python 代码
- 让他们在每个每个根目录中保存一个文件,项目可能会在其中使用这个包(这对我来说似乎很糟糕)
有没有我遗漏的选项?我如何将这些选项嵌入到 python 包中?
备注: 假设我的包具有结构:
- /root
- license.txt
- pyproject.toml
- readme.md
- setup.cfg
- setup.py
- /function_name
- file.py
- __init__.py
- /tests
- __init__.py
- file_test.py
其中 file.py 包含命令行工具和日常开发功能的所有信息。
您可以在顶级目录中创建 config.ini_sample
(并将其推送到您的 VCS):
[DEFAULT]
api_key = <API_KEY>
不用说,您可以从脚本创建这样的文件,或者让用户自己从文档中复制它。
然后用户必须创建一个名为 config.ini
的文件的副本并填写 <API_KEY>
然后你可以像这样使用内置 configparser
, but I would recommend using configobj
:
from configobj import ConfigObj
from package import class
config = ConfigObj("config.ini")
api_key = config["DEFAULT"].get("API_KEY")
instance = class(api_key=api_key)
instance.do_stuff()
configobj
将在专利目录中搜索 config.ini
,因此即使您的项目中有其他目录,它也可以使用。
如果你使用git,那么只需将config.ini
添加到.gitignore
并且不用担心推送秘密数据,只有config.ini_sample
,但不要忘记保持 config.ini_sample
和 config.ini
同步,这样就不会出现 config.ini
而不是 config.ini_sample
.
根据我的观点和所做的研究,这是最好的方法,但其他选择是:
- 使用环境变量
- 要有一个
config.py
文件,其中定义了值