Przeglądaj źródła

Django: Always call django.setup() before task modules imported. Closes #2227

Ask Solem 10 lat temu
rodzic
commit
827c5b1ad6
1 zmienionych plików z 11 dodań i 3 usunięć
  1. 11 3
      celery/fixups/django.py

+ 11 - 3
celery/fixups/django.py

@@ -45,6 +45,7 @@ class DjangoFixup(object):
     def __init__(self, app):
         self.app = app
         self.app.set_default()
+        self._worker_fixup = None
 
     def install(self):
         # Need to add project directory to path
@@ -53,12 +54,20 @@ class DjangoFixup(object):
         self.app.loader.now = self.now
         self.app.loader.mail_admins = self.mail_admins
 
+        signals.import_modules.connect(self.on_import_modules)
         signals.worker_init.connect(self.on_worker_init)
         return self
 
+    @cached_property
+    def worker_fixup(self):
+        return DjangoWorkerFixup(self.app)
+
+    def on_import_modules(self, **kwargs):
+        # call django.setup() before task modules are imported
+        self.worker_fixup.validate_models()
+
     def on_worker_init(self, **kwargs):
-        # keep reference
-        self._worker_fixup = DjangoWorkerFixup(self.app).install()
+        self.worker_fixup.install()
 
     def now(self, utc=False):
         return datetime.utcnow() if utc else self._now()
@@ -162,7 +171,6 @@ class DjangoWorkerFixup(object):
         signals.task_prerun.connect(self.on_task_prerun)
         signals.task_postrun.connect(self.on_task_postrun)
         signals.worker_process_init.connect(self.on_worker_process_init)
-        self.validate_models()
         self.close_database()
         self.close_cache()
         return self