Store config in the environment
https://12factor.net/config
The twelve-factor app stores config in environment variables (often shortened to env vars or env). Env vars are easy to change between deploys without changing any code; unlike config files, there is little chance of them being checked into the code repo accidentally; and unlike custom config files, or other config mechanisms such as Java System Properties, they are a language- and OS-agnostic standard.
pydantic_settings
https://fastapi.tiangolo.com/advanced/settings/#reading-a-env-file
fastapi推荐
https://docs.pydantic.dev/latest/concepts/pydantic_settings/#usage
from typing import Any, Callable, Set from pydantic import ( AliasChoices, AmqpDsn, BaseModel, Field, ImportString, PostgresDsn, RedisDsn, ) from pydantic_settings import BaseSettings, SettingsConfigDict class SubModel(BaseModel): foo: str = 'bar' apple: int = 1 class Settings(BaseSettings): auth_key: str = Field(validation_alias='my_auth_key') api_key: str = Field(alias='my_api_key') redis_dsn: RedisDsn = Field( 'redis://user:pass@localhost:6379/1', validation_alias=AliasChoices('service_redis_dsn', 'redis_url'), (3) ) pg_dsn: PostgresDsn = 'postgres://user:pass@localhost:5432/foobar' amqp_dsn: AmqpDsn = 'amqp://user:pass@localhost:5672/' special_function: ImportString[Callable[[Any], Any]] = 'math.cos' (4) # to override domains: # export my_prefix_domains='["foo.com", "bar.com"]' domains: Set[str] = set() # to override more_settings: # export my_prefix_more_settings='{"foo": "x", "apple": 1}' more_settings: SubModel = SubModel() model_config = SettingsConfigDict(env_prefix='my_prefix_') (5) print(Settings().model_dump()) """ { 'auth_key': 'xxx', 'api_key': 'xxx', 'redis_dsn': Url('redis://user:pass@localhost:6379/1'), 'pg_dsn': MultiHostUrl('postgres://user:pass@localhost:5432/foobar'), 'amqp_dsn': Url('amqp://user:pass@localhost:5672/'), 'special_function': math.cos, 'domains': set(), 'more_settings': {'foo': 'bar', 'apple': 1}, } """
使用.env覆盖默认值, 但是最终环境会覆盖.env值
from pydantic_settings import BaseSettings, SettingsConfigDict ''' default -> env file -> env variable ''' class Settings(BaseSettings): PATH: str = "Awesome API" USER: str = "xxx" TEST: str = "yyy" model_config = SettingsConfigDict(env_file=".env") if __name__ == "__main__": src.machine_learning_workflow_pipeline() print("---------------------------") print(Settings().PATH) print(Settings().USER) print(Settings().TEST)
dynaconf
https://www.dynaconf.com/#reading-settings-from-files
Features¶
- Inspired by the 12-factor application guide
- Settings management (default values, validation, parsing, templating)
- Protection of sensitive information (passwords/tokens)
- Multiple file formats
toml|yaml|json|ini|py
and also customizable loaders.- Full support for environment variables to override existing settings (dotenv support included).
- Optional layered system for multi environments
[default, development, testing, production]
(also called multi profiles)- Built-in support for Hashicorp Vault and Redis as settings and secrets storage.
- Built-in extensions for Django and Flask web frameworks.
- CLI for common operations such as
init, list, write, validate, export
.
标签:dsn,str,settings,Settings,environment,env,config,Store From: https://www.cnblogs.com/lightsong/p/17810070.html