Browse Source

Now able to successfully use and run celery outside of Django

Ask Solem 15 years ago
parent
commit
0935f92404
6 changed files with 58 additions and 7 deletions
  1. 6 0
      bin/celeryinit
  2. 16 0
      celery/bin/celeryinit.py
  3. 8 1
      celery/loaders/__init__.py
  4. 1 1
      celery/loaders/base.py
  5. 26 4
      celery/loaders/default.py
  6. 1 1
      setup.py

+ 6 - 0
bin/celeryinit

@@ -0,0 +1,6 @@
+#!/usr/bin/env python
+
+from celery.bin.celeryinit import main
+
+if __name__ == "__main__":
+    main()

+ 16 - 0
celery/bin/celeryinit.py

@@ -0,0 +1,16 @@
+#!/usr/bin/env python
+
+def main():
+    from celery.loaders.default import Loader
+    loader = Loader()
+    conf = loader.read_configuration()
+    #from django.core.management.commands.syncdb import Command as SyncDB
+    from django.core.management import call_command, setup_environ
+    print("Creating database tables...")
+    setup_environ(conf)
+    call_command("syncdb")
+
+if __name__ == "__main__":
+    main()
+
+

+ 8 - 1
celery/loaders/__init__.py

@@ -1,3 +1,10 @@
-from celery.loaders.djangoapp import Loader
+from celery.loaders.djangoapp import Loader as DjangoLoader
+from celery.loaders.default import Loader as DefaultLoader
+from django.conf import settings
+
+Loader = DefaultLoader
+if settings.configured:
+    Loader = DjangoLoader
+
 current_loader = Loader()
 settings = current_loader.conf

+ 1 - 1
celery/loaders/base.py

@@ -3,7 +3,7 @@
 class BaseLoader(object):
     _conf_cache = None
 
-    def on_task_preinit(self, task_id, task):
+    def on_task_init(self, task_id, task):
         pass
 
     def on_worker_init(self):

+ 26 - 4
celery/loaders/default.py

@@ -1,15 +1,37 @@
 from celery.loaders.base import BaseLoader
 
+DEFAULT_SETTINGS = {
+    "DEBUG": False,
+    "DATABASE_ENGINE": "sqlite3",
+    "DATABASE_NAME": "celery.sqlite",
+    "INSTALLED_APPS": ("celery", ),
+}
+
+
+def wanted_module_item(item):
+    is_private = item.startswith("_")
+    return not is_private
+
 
 class Loader(BaseLoader):
 
     def read_configuration(self):
-        import settings
-        from django.core.management import setup_environ
-        setup_environ(settings)
+        config = dict(DEFAULT_SETTINGS)
+        try:
+            import celeryconfig
+        except ImportError:
+            pass
+        else:
+            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(**config)
         return settings
 
     def on_worker_init(self):
         imports = getattr(self.conf, "CELERY_TASK_MODULES", [])
         for module in imports:
-            __import__(module, [], [], {''})
+            __import__(module, [], [], [''])

+ 1 - 1
setup.py

@@ -66,7 +66,7 @@ setup(
     url=celery.__homepage__,
     platforms=["any"],
     packages=find_packages(exclude=['ez_setup']),
-    scripts=["bin/celeryd"],
+    scripts=["bin/celeryd", "bin/celeryinit"],
     zip_safe=False,
     install_requires=install_requires,
     extra_requires={