Browse Source

Default Loader: Added new method setup_django_env() to easily create new
loaders:

from celery.loaders.default import Loader as DefaultLoader

class Loader(DefaultLoader):

def read_configuration(self):
configdict = parse_ini_file("celery.ini")
return self.setup_django_env(configdict)

Ask Solem 15 years ago
parent
commit
415f73965f
3 changed files with 23 additions and 13 deletions
  1. 1 1
      celery/loaders/base.py
  2. 15 11
      celery/loaders/default.py
  3. 7 1
      celery/tests/test_loaders.py

+ 1 - 1
celery/loaders/base.py

@@ -30,7 +30,7 @@ class BaseLoader(object):
         return __import__(module, [], [], [''])
 
     def import_default_modules(self):
-        imports = getattr(self.conf, "CELERY_IMPORTS", [])
+        imports = getattr(self.conf, "CELERY_IMPORTS", None) or []
         return map(self.import_task_module, imports)
 
     @property

+ 15 - 11
celery/loaders/default.py

@@ -23,26 +23,30 @@ class Loader(BaseLoader):
 
     """
 
+    def setup_django_env(self, settingsdict):
+        config = dict(DEFAULT_SETTINGS, **settingsdict)
+
+        from django.conf import settings
+        if not settings.configured:
+            settings.configure()
+        for config_key, config_value in config.items():
+            setattr(settings, config_key, config_value)
+        installed_apps = set(list(DEFAULT_SETTINGS["INSTALLED_APPS"]) + \
+                             list(settings.INSTALLED_APPS))
+        settings.INSTALLED_APPS = tuple(installed_apps)
+
+        return settings
+
     def read_configuration(self):
         """Read configuration from ``celeryconfig.py`` and configure
         celery and Django so it can be used by regular Python."""
-        config = dict(DEFAULT_SETTINGS)
         configname = os.environ.get("CELERY_CONFIG_MODULE",
                                     DEFAULT_CONFIG_MODULE)
         celeryconfig = __import__(configname, {}, {}, [''])
         usercfg = dict((key, getattr(celeryconfig, key))
                             for key in dir(celeryconfig)
                                 if wanted_module_item(key))
-        config.update(usercfg)
-        from django.conf import settings
-        if not settings.configured:
-            settings.configure()
-        for config_key, config_value in usercfg.items():
-            setattr(settings, config_key, config_value)
-        installed_apps = set(list(DEFAULT_SETTINGS["INSTALLED_APPS"]) + \
-                             list(settings.INSTALLED_APPS))
-        settings.INSTALLED_APPS = tuple(installed_apps)
-        return settings
+        return self.setup_django_env(usercfg)
 
     def on_worker_init(self):
         """Imports modules at worker init so tasks can be registered

+ 7 - 1
celery/tests/test_loaders.py

@@ -72,7 +72,13 @@ class TestDjangoLoader(unittest.TestCase):
         self.loader = loaders.DjangoLoader()
 
     def test_on_worker_init(self):
-        self.assertRaises(ImportError, self.loader.on_worker_init)
+        from django.conf import settings
+        old_imports = settings.CELERY_IMPORTS
+        settings.CELERY_IMPORTS = ("xxx.does.not.exist", )
+        try:
+            self.assertRaises(ImportError, self.loader.on_worker_init)
+        finally:
+            settings.CELERY_IMPORTS = old_imports
 
     def test_race_protection(self):
         djangoapp._RACE_PROTECTION = True