Skip to content

Commit

Permalink
get settings module name on fork rather than on app initialization. It
Browse files Browse the repository at this point in the history
allows people to use relative path in their projects. fix issues benoitc#219,
and benoitc#213
  • Loading branch information
benoitc committed Aug 21, 2011
1 parent f593922 commit 17b47a3
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 50 deletions.
2 changes: 1 addition & 1 deletion examples/frameworks/djangotest/settings.py
Expand Up @@ -72,7 +72,7 @@
TEMPLATE_DIRS = ()


SOME_VALUE = "hello world 2"
SOME_VALUE = "hello world"

INSTALLED_APPS = (
'django.contrib.auth',
Expand Down
2 changes: 1 addition & 1 deletion gunicorn/app/base.py
Expand Up @@ -59,7 +59,7 @@ def load_config(self):
cfg = self.init(parser, opts, args)

# Load up the any app specific configuration
if cfg:
if cfg and cfg is not None:
for k, v in cfg.items():
self.cfg.set(k.lower(), v)

Expand Down
138 changes: 90 additions & 48 deletions gunicorn/app/djangoapp.py
Expand Up @@ -18,42 +18,64 @@
class DjangoApplication(Application):

def init(self, parser, opts, args):
self.settings_modname = None
self.project_path = os.getcwd()
self.global_settings_path = None
self.project_path = None
if args:
settings_path = os.path.abspath(os.path.normpath(args[0]))
if not os.path.exists(settings_path):
self.no_settings(settings_path)
else:
self.project_path = os.path.dirname(settings_path)
else:
self.global_settings_path = args[0]
if not os.path.exists(os.path.abspath(args[0])):
self.no_settings(args[0])

def get_settings_modname(self):
from django.conf import ENVIRONMENT_VARIABLE

# get settings module
settings_modname = None
if not self.global_settings_path:
project_path = os.getcwd()
try:
self.settings_modname = os.environ[ENVIRONMENT_VARIABLE]
settings_modname = os.environ[ENVIRONMENT_VARIABLE]
except KeyError:
settings_path = os.path.join(self.project_path, "settings.py")
settings_path = os.path.join(project_path, "settings.py")
if not os.path.exists(settings_path):
return self.no_settings(settings_path)
else:
settings_path = os.path.abspath(self.global_settings_path)
if not os.path.exists(settings_path):
return self.no_settings(settings_path)
project_path = os.path.dirname(settings_path)


if not self.settings_modname:
project_name = os.path.split(self.project_path)[-1]
if not settings_modname:
project_name = os.path.split(project_path)[-1]
settings_name, ext = os.path.splitext(
os.path.basename(settings_path))
self.settings_modname = "%s.%s" % (project_name, settings_name)
os.environ[ENVIRONMENT_VARIABLE] = self.settings_modname
self.cfg.set("default_proc_name", self.settings_modname)
settings_modname = "%s.%s" % (project_name, settings_name)
os.environ[ENVIRONMENT_VARIABLE] = settings_modname

self.cfg.set("default_proc_name", settings_modname)

# add the project path to sys.path
if not self.project_path in sys.path:
sys.path.insert(0, self.project_path)
sys.path.append(os.path.normpath(os.path.join(self.project_path,
if not project_path in sys.path:
# remove old project path from sys.path
if self.project_path is not None:
idx = sys.path.find(self.project_path)
if idx >= 0:
del sys.path[idx]
self.project_path = project_path

sys.path.insert(0, project_path)
sys.path.append(os.path.normpath(os.path.join(project_path,
os.pardir)))

def setup_environ(self):
return settings_modname

def setup_environ(self, settings_modname):
from django.core.management import setup_environ

# setup environ
try:
parts = self.settings_modname.split(".")
settings_mod = __import__(self.settings_modname)
parts = settings_modname.split(".")
settings_mod = __import__(settings_modname)
if len(parts) > 1:
settings_mod = __import__(parts[0])
path = os.path.dirname(os.path.abspath(
Expand All @@ -63,7 +85,7 @@ def setup_environ(self):
settings_mod = getattr(settings_mod, part)
setup_environ(settings_mod)
except ImportError:
return self.no_settings(self.settings_modname, import_error=True)
return self.no_settings(settings_modname, import_error=True)

def no_settings(self, path, import_error=False):
if import_error:
Expand Down Expand Up @@ -99,12 +121,9 @@ def validate(self):
sys.exit(1)

def load(self):
from django.conf import ENVIRONMENT_VARIABLE
from django.core.handlers.wsgi import WSGIHandler

os.environ[ENVIRONMENT_VARIABLE] = self.settings_modname

self.setup_environ()

self.setup_environ(self.get_settings_modname())
self.validate()
self.activate_translation()
return WSGIHandler()
Expand All @@ -118,26 +137,14 @@ def __init__(self, options, admin_media_path):
self.options = options
self.admin_media_path = admin_media_path
self.callable = None
self.init()
self.project_path = None
self.do_load_config()

for k, v in self.options.items():
if k.lower() in self.cfg.settings and v is not None:
self.cfg.set(k.lower(), v)

def init(self):
self.settings_modname = os.environ[ENVIRONMENT_VARIABLE]
self.project_name = self.settings_modname.split('.')[0]
self.project_path = os.getcwd()


# add the project path to sys.path
if not self.project_path in sys.path:
sys.path.insert(0, self.project_path)
sys.path.append(os.path.normpath(os.path.join(self.project_path,
os.pardir)))

def load_config(self):
self.cfg = Config()

Expand Down Expand Up @@ -172,15 +179,48 @@ def load_config(self):
self.cfg.set(k.lower(), v)



def reload_django_settings(self):
def get_settings_modname(self):
from django.conf import ENVIRONMENT_VARIABLE
os.environ[ENVIRONMENT_VARIABLE] = self.settings_modname

settings_modname = None
project_path = os.getcwd()
try:
settings_modname = os.environ[ENVIRONMENT_VARIABLE]
except KeyError:
settings_path = os.path.join(project_path, "settings.py")
if not os.path.exists(settings_path):
return self.no_settings(settings_path)

if not settings_modname:
project_name = os.path.split(project_path)[-1]
settings_name, ext = os.path.splitext(
os.path.basename(settings_path))
settings_modname = "%s.%s" % (project_name, settings_name)
os.environ[ENVIRONMENT_VARIABLE] = settings_modname

self.cfg.set("default_proc_name", settings_modname)
# add the project path to sys.path
if not project_path in sys.path:
# remove old project path from sys.path
if self.project_path is not None:
idx = sys.path.find(self.project_path)
if idx >= 0:
del sys.path[idx]
self.project_path = project_path
sys.path.insert(0, project_path)
sys.path.append(os.path.normpath(os.path.join(project_path,
os.pardir)))

# reload django settings
self.reload_django_settings(settings_modname)

return settings_modname

def reload_django_settings(self, settings_modname):
from django.conf import settings
from django.utils import importlib

mod = importlib.import_module(self.settings_modname)
mod = importlib.import_module(settings_modname)

# reload module
reload(mod)
Expand Down Expand Up @@ -243,8 +283,10 @@ def reload_django_settings(self):
def load(self):
from django.core.handlers.wsgi import WSGIHandler

self.reload_django_settings()
self.setup_environ()
# reload django settings and setup environ
self.setup_environ(self.get_settings_modname())

# validate models and activate translation
self.validate()
self.activate_translation()

Expand Down

0 comments on commit 17b47a3

Please sign in to comment.