diff --git a/docs/providers/configuration.rst b/docs/providers/configuration.rst index 3e4696f1..582c0cc1 100644 --- a/docs/providers/configuration.rst +++ b/docs/providers/configuration.rst @@ -183,22 +183,22 @@ See also: :ref:`configuration-envs-interpolation`. Loading from a Pydantic settings -------------------------------- -``Configuration`` provider can load configuration from a ``pydantic`` settings object using the +``Configuration`` provider can load configuration from a ``pydantic_settings.BaseSettings`` object using the :py:meth:`Configuration.from_pydantic` method: .. literalinclude:: ../../examples/providers/configuration/configuration_pydantic.py :language: python :lines: 3- - :emphasize-lines: 31 + :emphasize-lines: 32 -To get the data from pydantic settings ``Configuration`` provider calls ``Settings.dict()`` method. +To get the data from pydantic settings ``Configuration`` provider calls its ``model_dump()`` method. If you need to pass an argument to this call, use ``.from_pydantic()`` keyword arguments. .. code-block:: python container.config.from_pydantic(Settings(), exclude={"optional"}) -Alternatively, you can provide a ``pydantic`` settings object over the configuration provider argument. In that case, +Alternatively, you can provide a ``pydantic_settings.BaseSettings`` object over the configuration provider argument. In that case, the container will call ``config.from_pydantic()`` automatically: .. code-block:: python @@ -215,18 +215,23 @@ the container will call ``config.from_pydantic()`` automatically: .. note:: - ``Dependency Injector`` doesn't install ``pydantic`` by default. + ``Dependency Injector`` doesn't install ``pydantic-settings`` by default. You can install the ``Dependency Injector`` with an extra dependency:: - pip install dependency-injector[pydantic] + pip install dependency-injector[pydantic2] - or install ``pydantic`` directly:: + or install ``pydantic-settings`` directly:: - pip install pydantic + pip install pydantic-settings *Don't forget to mirror the changes in the requirements file.* +.. note:: + + For backward-compatibility, Pydantic v1 is still supported. + Passing ``pydantic.BaseSettings`` instances will work just as fine as ``pydantic_settings.BaseSettings``. + Loading from a dictionary ------------------------- diff --git a/examples/providers/configuration/configuration_pydantic.py b/examples/providers/configuration/configuration_pydantic.py index aaed5d26..aca34e92 100644 --- a/examples/providers/configuration/configuration_pydantic.py +++ b/examples/providers/configuration/configuration_pydantic.py @@ -3,7 +3,7 @@ import os from dependency_injector import containers, providers -from pydantic import BaseSettings, Field +from pydantic_settings import BaseSettings, SettingsConfigDict # Emulate environment variables os.environ["AWS_ACCESS_KEY_ID"] = "KEY" @@ -11,15 +11,16 @@ os.environ["AWS_SECRET_ACCESS_KEY"] = "SECRET" class AwsSettings(BaseSettings): + model_config = SettingsConfigDict(env_prefix="aws_") - access_key_id: str = Field(env="aws_access_key_id") - secret_access_key: str = Field(env="aws_secret_access_key") + access_key_id: str + secret_access_key: str class Settings(BaseSettings): aws: AwsSettings = AwsSettings() - optional: str = Field(default="default_value") + optional: str = "default_value" class Container(containers.DeclarativeContainer): diff --git a/examples/providers/configuration/configuration_pydantic_init.py b/examples/providers/configuration/configuration_pydantic_init.py index f904d9df..ee0a02e6 100644 --- a/examples/providers/configuration/configuration_pydantic_init.py +++ b/examples/providers/configuration/configuration_pydantic_init.py @@ -3,7 +3,7 @@ import os from dependency_injector import containers, providers -from pydantic import BaseSettings, Field +from pydantic_settings import BaseSettings, SettingsConfigDict # Emulate environment variables os.environ["AWS_ACCESS_KEY_ID"] = "KEY" @@ -11,15 +11,16 @@ os.environ["AWS_SECRET_ACCESS_KEY"] = "SECRET" class AwsSettings(BaseSettings): + model_config = SettingsConfigDict(env_prefix="aws_") - access_key_id: str = Field(env="aws_access_key_id") - secret_access_key: str = Field(env="aws_secret_access_key") + access_key_id: str + secret_access_key: str class Settings(BaseSettings): aws: AwsSettings = AwsSettings() - optional: str = Field(default="default_value") + optional: str = "default_value" class Container(containers.DeclarativeContainer):