Last active
August 17, 2023 10:44
-
-
Save bennylope/2999704 to your computer and use it in GitHub Desktop.
Django manage.py file that loads environment variables from a .env file per Honcho/Foreman
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Copyright the authors of Honcho and/or Ben Lopatin | |
Licensed for reuse, modification, and distribution under the terms of the MIT license |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
import os | |
import sys | |
import re | |
def read_env(): | |
"""Pulled from Honcho code with minor updates, reads local default | |
environment variables from a .env file located in the project root | |
directory. | |
""" | |
try: | |
with open('.env') as f: | |
content = f.read() | |
except IOError: | |
content = '' | |
for line in content.splitlines(): | |
m1 = re.match(r'\A([A-Za-z_0-9]+)=(.*)\Z', line) | |
if m1: | |
key, val = m1.group(1), m1.group(2) | |
m2 = re.match(r"\A'(.*)'\Z", val) | |
if m2: | |
val = m2.group(1) | |
m3 = re.match(r'\A"(.*)"\Z', val) | |
if m3: | |
val = re.sub(r'\\(.)', r'\1', m3.group(1)) | |
os.environ.setdefault(key, val) | |
if __name__ == "__main__": | |
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project_name.settings") | |
from django.core.management import execute_from_command_line | |
read_env() | |
execute_from_command_line(sys.argv) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
import os | |
import sys | |
if __name__ == "__main__": | |
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project_name.settings") | |
from django.core.management import execute_from_command_line | |
execute_from_command_line(sys.argv) |
Hey! It not work, when you need use custom .env file in django app. It searches from .env file in django root settings directory.
Thank you very much!!!!
I change:
with open('.env') as f:
for
with open('path/to/.env') as f:
and works fantastic
Very useful, thanks.
I use honcho in some of my deployment scripts, so in that case I don't want the local .env file mucking things up.
I added a check before the "try" block that simply returns from read_env() if one of my environment variables is already set.
# Don't do anything if the environment is already loaded
# If YOUR_VARIABLE is defined then exit
if os.environ.get("YOUR_VARIABLE") is not None:
print("Environment already loaded. Ignoring .env")
return
try:
with open("../.env") as f:
content = f.read()
except IOError:
return`
Obviously replace YOUR_VARIABLE with, well, your variable!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I think it's worth noting (for people who won't read the blog post) that if you want to use Booleans in the .env file then you need to parse the string yourself. In the blog they use this function: