允许用户为 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()

我的想法是:

  1. 如果用户想使用全局变量(但我担心跨平台问题),请让用户在终端中进行设置阶段
  2. 为每个 python 环境(放入 python 路径)python 制作一段 python 代码
  3. 让他们在每个每个根目录中保存一个文件,项目可能会在其中使用这个包(这对我来说似乎很糟糕)

有没有我遗漏的选项?我如何将这些选项嵌入到 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_sampleconfig.ini 同步,这样就不会出现 config.ini 而不是 config.ini_sample.

的配置

根据我的观点和所做的研究,这是最好的方法,但其他选择是:

  • 使用环境变量
  • 要有一个 config.py 文件,其中定义了值