Dynaconf 使用 .secrets.toml 覆盖 settings.toml 中的部分

Ant*_*Oca 2 python

我正在使用 Dynaconf (3.1.2) 来处理我的 python 应用程序设置。

settings.toml如果我在at 和 at使用相同的密钥.secrets.toml,则这些部分最后仅包含机密文件中的值,而不再包含设置文件中的值。我该如何处理这个问题?

我有以下设置:

# settings.toml
[smtp]
host = "mail.myserver.com"
port = 587
username = "me@myserver.com"
Run Code Online (Sandbox Code Playgroud)
# .secrets.toml
[smtp]
password = "mysecretpassword"
Run Code Online (Sandbox Code Playgroud)

当我尝试获取 settings.smtp.host 时,出现以下异常:

dynaconf.vendor.box.exceptions.BoxKeyError: "'DynaBox' object has no attribute 'HOST'"
Run Code Online (Sandbox Code Playgroud)

在调试设置对象时可以看到:

'SMTP': <Box: {'password': 'mysecretpassword'}>

Run Code Online (Sandbox Code Playgroud)

Abh*_*ani 5

您需要允许合并。Dynaconf 将在加载文件时覆盖配置。在您的情况下, 的内容settings.toml将被覆盖,.secrets.toml因为它是在 后加载的settings.toml

为了避免这种情况,您可以启用dynaconf_merge.

# settings.toml
[smtp]
host = "mail.myserver.com"
port = 587
username = "me@myserver.com"
Run Code Online (Sandbox Code Playgroud)
# .secrets.toml
[smtp]
dynaconf_merge = true
password = "mysecretpassword"
Run Code Online (Sandbox Code Playgroud)

这会将您的smtp对象从合并.secrets.tomlsettings.toml,并且不会覆盖。

您还可以启用全局合并,例如

# .secrets.toml
dynaconf_merge = true
[smtp]
password = "mysecretpassword"
Run Code Online (Sandbox Code Playgroud)

这会将所有对象合并.secret.toml为具有相同名称的对象settings.toml

参考:https://www.dynaconf.com/merging/#local-configuration-files-and-merging-to-existing-data