Reusable dynamic config provider with YAML fallback and Nacos backends
Project description
dynamic-config-nacos
dynamic-config-nacos is a small reusable Python package for dynamic
configuration loading.
Its goal is to give application projects one consistent way to read configuration, whether the source is a local YAML file or a Nacos server.
Author: FrankTang (franktz2003@gmail.com)
License: MIT
What This Library Does
- Uses local YAML as a fallback configuration source
- Fetches remote configuration from Nacos
- Supports automatic backend selection across
http,sdk_v2, andsdk_v3 - Refreshes in-memory configuration on updates on a best-effort basis
- Provides a lightweight
Confobject for dot-path and index-based access
Install
pip install dynamic-config-nacos
The Python import name remains dynamic_config:
from dynamic_config import DynamicConfigProvider
For local workspace development with uv, downstream projects can also use a
path dependency to this package.
Quick Start
from dynamic_config import DynamicConfigProvider
provider = DynamicConfigProvider(local_yaml_path="configs/local.yaml")
provider.load_from_env()
app_name = provider.get("app.name")
Usage
Local YAML Only
from dynamic_config import DynamicConfigProvider
provider = DynamicConfigProvider(local_yaml_path="configs/local.yaml")
provider.load_initial(None)
debug = provider.get("app.debug", False)
Enable Nacos with Environment Variables
$env:NACOS_SERVER_ADDR = "127.0.0.1:8848"
$env:NACOS_DATA_ID = "app.yaml"
$env:NACOS_GROUP = "DEFAULT_GROUP"
from dynamic_config import DynamicConfigProvider
provider = DynamicConfigProvider(local_yaml_path="configs/local.yaml")
provider.load_from_env()
app_name = provider.get("app.name")
Override the Local YAML Path
DynamicConfigProvider currently requires a local_yaml_path value during
construction, but load_from_env() will override it if LOCAL_CONFIG_PATH is
set.
$env:LOCAL_CONFIG_PATH = "configs/dev.local.yaml"
After load_from_env(), the library will use the path from
LOCAL_CONFIG_PATH.
Read Values Through Conf
conf = provider.conf
value1 = conf["a.b[0].c"]
value2 = conf.a.b[0].c
value3 = conf.get("a.x", "fallback")
Logging
This package uses the standard library logging module and does not currently
accept a custom logger object from callers.
Internally it uses module-level loggers like this:
logger = logging.getLogger(__name__)
That means the host application controls log output, handlers, formatting, and log levels:
import logging
logging.basicConfig(level=logging.INFO)
Typical log events include:
warningwhen the local YAML file is missingwarningwhen Nacos returns a non-mapping YAML rootwarningfor invalid backend or polling interval valuesinfowhen a Nacos update has been appliedinfowhen a backend is auto-selectedexceptionwhen Nacos fetch, watcher startup, login, or version detection fails
Does the Local YAML File Need to Exist?
local_yaml_pathis currently a required constructor argument- The file itself does not need to exist
- If the file is missing, the library logs a warning and falls back to an empty
config
{} - If Nacos successfully returns a config, the local YAML file is not used for that load
In practice, the path behaves more like a local fallback location than a strict required input file.
Internal Design Overview
The library's loading flow looks like this:
- Create
DynamicConfigProviderwith a local YAML path. - Call
load_from_env()to read Nacos-related environment variables. - If
NACOS_SERVER_ADDRis present, build aNacosSettingsobject. - Create a Nacos backend using explicit configuration or auto-detection.
- Try to fetch YAML content from Nacos first.
- If Nacos fails, returns empty content, or returns a non-mapping YAML root, fall back to the local YAML file.
- Store the final raw dictionary and wrap it in a
Confobject. - If the backend supports watching, start a watcher and refresh the in-memory config on updates.
Auto Backend Selection
When backend=AUTO, the package first tries to detect the Nacos server major
version and then picks a preferred order:
- Nacos 2.x:
sdk_v2->sdk_v3->http - Nacos 3.x:
sdk_v3->sdk_v2->http - Detection failed:
sdk_v3->sdk_v2->http
HTTP Mode
- Fetches config through the Nacos HTTP API
- Optionally logs in first to obtain an
accessToken - Starts a background polling thread
- Uses content MD5 to detect changes
SDK Mode
- Tries multiple SDK import paths
- Tries both
get_configandgetConfig - Tries
add_config_watchers,add_config_watcher, andadd_listener
Public API
DynamicConfigProviderConfNullConfNULLNacosSettingsNacosBackendType
Additional Docs
- English usage guide: how-to-use.md
- Chinese usage guide: how-to-use.zh-CN.md
- Chinese overview: README.zh-CN.md
Project Links
- Homepage: https://github.com/franktz/dynamic-config-nacos
- Repository: https://github.com/franktz/dynamic-config-nacos
- Issues: https://github.com/franktz/dynamic-config-nacos/issues
Author
- FrankTang
- Email: franktz2003@gmail.com
- License: MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dynamic_config_nacos-0.1.0.tar.gz.
File metadata
- Download URL: dynamic_config_nacos-0.1.0.tar.gz
- Upload date:
- Size: 14.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
668da864dad223da3297d4a54e9fcaa62b49ed41250d3e49793bd612c2ddf11c
|
|
| MD5 |
8441ef4d53d94894106523e080c0a13c
|
|
| BLAKE2b-256 |
2ef89ec63e2e79134babd21d0a00aee4df265df33cd600f2ec1aff77f24097e2
|
File details
Details for the file dynamic_config_nacos-0.1.0-py3-none-any.whl.
File metadata
- Download URL: dynamic_config_nacos-0.1.0-py3-none-any.whl
- Upload date:
- Size: 10.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2526bdd0f7527eba0fdbc5a9a6d83960e9cf68c524dfd7f9645e80e6d87cdcfb
|
|
| MD5 |
fdb66b0a4111e9dc8a5cf76e867da7bb
|
|
| BLAKE2b-256 |
c8c7bc5fc0581ba6dcec88f40bb30f0a398fbd948339cfd2cae8f25b72b5f05c
|