DEV Community

Cover image for Separating Sensitive Data from Code (using python-decouple)
John Johnson Okah
John Johnson Okah

Posted on

Separating Sensitive Data from Code (using python-decouple)

Whenever I learn any code related stuff, I make sure I follow it all through till the end and then push the code to My Repo. As I git push and enjoy the feeling of completing a task, sometimes GitHub Bot tries to cut short the party by emailing me about a security issue; that I have exposed some sensitive data.

Those times, I wished I could reply GitHub Bot:

"Thanks for letting me know.
This is just a test project, so .."

Alt Text
And my completion party continues ... πŸŽ‰

Nevertheless, deep down I knew I needed to make my project production-ready. Then I found python-decouple.

Decouple helps you to organize your settings so that you can change parameters without having to redeploy your app.

Let me show you how I used decouple to seperate sensitive data from my code:

settings.py (before decoupling)

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = ",q9XmWx-tB^pv+Z:a7S^%&W5+&3o4f-tl14ongf(4*!(%u++)-n"
DEBUG = True

DATABASE_URL = "postgres://johndoe:mypassword@123.456.789.000:5000/blog_db"
DATABASES = {"default": dj_database_url.config(default=config("DATABASE_URL"))}

EMAIL_HOST = "stmp.gmail.com"
EMAIL_HOST_USER = "johndoe@gmail.com"
EMAIL_HOST_PASSWORD = "johndoepassword123"
EMAIL_PORT = 543
EMAIL_USE_TLS = True
Enter fullscreen mode Exit fullscreen mode

πŸ”© Okay let's decouple some sh*t! πŸ”©

πŸ“Œ First install python-decouple on your virtual environment

$ pip install python-decouple
Enter fullscreen mode Exit fullscreen mode

πŸ“Œ Add this at the top of settings.py

from decouple import config
Enter fullscreen mode Exit fullscreen mode

πŸ“Œ And then change the value of sensitive data to point to your environment variables
settings.py

SECRET_KEY = config("SECRET_KEY")
DEBUG = config("DEBUG", default=False, cast=bool)

DATABASES = {"default": dj_database_url.config(default=config("DATABASE_URL"))}

EMAIL_HOST = config("EMAIL_HOST", default="localhost")
EMAIL_HOST_USER = config("EMAIL_HOST_USER", default="")
EMAIL_HOST_PASSWORD = config("EMAIL_HOST_PASSWORD", default="")
EMAIL_PORT = config("EMAIL_PORT", default=25, cast=int)
EMAIL_USE_TLS = config("EMAIL_USE_TLS", default=False, cast=bool)
Enter fullscreen mode Exit fullscreen mode

πŸ“Œ Add .env file at the root of your project

$ touch .env
Enter fullscreen mode Exit fullscreen mode

πŸ“Œ Make sure .env is added to your .gitignore file.
.gitignore

# ... other ignored files
.env
Enter fullscreen mode Exit fullscreen mode

πŸ“Œ Now you can define those environment variables in the .env file
.env

SECRET_KEY=,q9XmWx-tB^pv+Z:a7S^%&W5+&3o4f-tl14ongf(4*!(%u++)-n
DEBUG=True

DATABASE_URL=postgres://johndoe:mypassword@123.456.789.000:5000/blog_db

EMAIL_HOST=stmp.gmail.com
EMAIL_HOST_USER=johndoe@gmail.com
EMAIL_HOST_PASSWORD=johndoepassword123
EMAIL_PORT=543
EMAIL_USE_TLS=True
Enter fullscreen mode Exit fullscreen mode

And that was it. πŸš€πŸš€

We can now push our code to github without being scared of exposing sensitive data.

Note: when it's time for production, nothing in your code changes. Just define your sensitive data in the production environment.

Top comments (0)