Skip to main content

Python-DotEnv-Settings-Handler

A Settings Handler to be used with python-dotenv to load and read all the settings from a Settings class.

Instead of loading the env variables as os.getenv("MY_VAR"), create a class with all your env variables, and load them as settings.MY_VAR.

Requirements

  • Python 3.x (tested on Python 3.7)
  • Libraries: python-dotenv, pydantic

Changelog

  • 0.0.1 - Initial release

Example

Start by creating a .env file, as you would usually do using python-dotenv, or define all or some of these variables as system environment variables.

DATABASE_PORT=33306
DATABASE_USER=foo
DATABASE_PASSWORD=bar
DATABASE_DB=mydb

Then, create a new class inheriting from SettingsHandler:

  • SettingsHandler inherits from pydantic.BaseSettings, working in a similar manner as pydantic.BaseModel. Check pydantic documentation to know more about it.
  • Basically you must define on your custom class the wanted ENV variables, which must have the same name as on the .env file.
  • You can define a default value to be used if a certain variable is not defined on the .env file (in the example: DATABASE_SERVER, DATABASE_PORT).
  • You should set the data type (str, int) on the values without default value (in the example: DATABASE_USER, DATABASE_PASSWORD, DATABASE_DB).
  • If an env variable without default value not exists, when creating an instance of MySettings() a pydantic exception will be raised, asking to fill a required class attribute.
# settings.py

from dotenv_settings_handler import SettingsHandler

class MySettings(SettingsHandler):
    DATABASE_SERVER = "127.0.0.1"
    DATABASE_PORT = 3306
    DATABASE_USER: str
    DATABASE_PASSWORD: str
    DATABASE_DB: str

my_settings = MySettings()

Finally, you can import the my_settings class instance anywhere you want to use these settings:

# connection.py

from .settings import my_settings as settings
import pymysql

connection = pymysql.connect(
    host=settings.DATABASE_SERVER,
    port=settings.DATABASE_PORT,
    user=settings.DATABASE_USER,
    password=settings.DATABASE_PASSWORD,
    db=settings.DATABASE_DB,
    charset='utf8mb4',
    cursorclass=pymysql.cursors.DictCursor
)

This is what happened to each ENV var:

  • DATABASE_SERVER: not defined on .env, so defaults to "127.0.0.1"
  • DATABASE_PORT: defined on .env as 33306. Since in the class defaults to 3306 (an int), is automatically casted to int by pydantic.
  • DATABASE_USER, DATABASE_PASSWORD, DATABASE_DB: defined on .env, and have no default values, so they are required. Not defining them on the .env file, nor as system env variables, would raise a pydantic exception when creating the MySettings() instance at settings.py.

Metadata

Release files for dotenv-settings-handler 0.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dotenv-settings-handler 0.0.1
File Size Uploaded
dotenv-settings-handler-0.0.1.tar.gz 2.9 kB Details

Release files / dotenv-settings-handler-0.0.1.tar.gz

Download URL dotenv-settings-handler-0.0.1.tar.gz
Size 2.9 kB
Tags Source
SHA-256 checksum
How to use checksums
cd53ec70ea26616f928b1cebbc4fe1d26647da5265cb7122ee5c09ad061608fb
BLAKE2b-256 checksum
How to use checksums
a755fc5982b255f7b4b2e89e22d0ee732f96a5478d1958b82f5065c27b8c1d0d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.13.0 pkginfo/1.5.0.1 requests/2.20.0 setuptools/40.5.0 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.7.1

Release history Release notifications | RSS feed

0.0.3

1 release file

0.0.2

1 release file

This release

0.0.1 This release

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page