From f1d5f26dfaa3e7fafeb791e9dd947f37ee6705e7 Mon Sep 17 00:00:00 2001 From: benoitc Date: Sun, 24 Apr 2011 09:05:27 +0200 Subject: [PATCH] django manage.py load settings before we launch every worker. This change remove it from loaded modules on reload. While we are here we remove any django module preloaded so we can upgrade django version to on HUP. fix issue #197. --- gunicorn/app/djangoapp.py | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/gunicorn/app/djangoapp.py b/gunicorn/app/djangoapp.py index 6ea6608f..4e856032 100644 --- a/gunicorn/app/djangoapp.py +++ b/gunicorn/app/djangoapp.py @@ -62,12 +62,17 @@ class DjangoApplication(Application): def no_settings(self, path, import_error=False): if import_error: - error = "Error: Can't find the settings in your PYTHONPATH" + error = "Error: Can't find '%s' in your PYTHONPATH.\n" % path else: error = "Settings file '%s' not found in current folder.\n" % path sys.stderr.write(error) sys.stderr.flush() sys.exit(1) + + def activate_translation(self): + from django.conf import settings + from django.utils import translation + translation.activate(settings.LANGUAGE_CODE) def validate(self): """ Validate models. This also ensures that all models are @@ -90,13 +95,15 @@ class DjangoApplication(Application): def load(self): from django.conf import ENVIRONMENT_VARIABLE from django.core.handlers.wsgi import WSGIHandler + os.environ[ENVIRONMENT_VARIABLE] = self.settings_modname # setup environ self.setup_environ() self.validate() + self.activate_translation() return WSGIHandler() -class DjangoApplicationCommand(Application): +class DjangoApplicationCommand(DjangoApplication): def __init__(self, options, admin_media_path): self.usage = None @@ -105,6 +112,9 @@ class DjangoApplicationCommand(Application): self.options = options self.admin_media_path = admin_media_path self.callable = None + self.settings_modname = os.environ[ENVIRONMENT_VARIABLE] + self.project_path = os.getcwd() + self.do_load_config() def load_config(self): @@ -138,10 +148,30 @@ class DjangoApplicationCommand(Application): 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 setup_environ(self): + for modname in sys.modules.keys(): + if modname.startswith('django') or \ + 'settings' in modname.split('.'): + del sys.modules[modname] + + # add the project path to sys.path + sys.path.insert(0, self.project_path) + sys.path.append(os.path.join(self.project_path, os.pardir)) + + super(DjangoApplicationCommand, self).setup_environ() + + def load(self): + # setup environ + self.setup_environ() + self.validate() + self.activate_translation() + from django.core.servers.basehttp import AdminMediaHandler, WSGIServerException from django.core.handlers.wsgi import WSGIHandler + try: return AdminMediaHandler(WSGIHandler(), self.admin_media_path) except WSGIServerException, e: