Я прочитал это , но не смог понять.Мои навыки ограничены.Я пробовал несколько ответов от stackoverflow, но они не работают для Celery4, который я использую.
У меня есть tasks.py
с pn_list
в нем
@shared_task
def pn_list(user_ids: typing.List[int], title, msg, extra: typing.Dict = None):
...
Когда я вызываю эту функцию в serializer
, мне приходится звонить с pn_list.delay(...)
.Это становится проблемой.
Попытка:
Я установил CELERY_TASK_ALWAYS_EAGER=True
и CELERY_TASK_EAGER_PROPAGATES=True
settings.py
.Это работает в Celery3, но моя версия 4
Ошибка:
File "/Users/sarit/mein-codes/multy_herr/multy_herr/tweets/api/serializers.py", line 208, in create
pn_list.delay(tmp_ids, title, msg, notification_msg)
File "/Users/sarit/.pyenv/versions/multy_herr/lib/python3.7/site-packages/celery/app/task.py", line 427, in delay
return self.apply_async(args, kwargs)
File "/Users/sarit/.pyenv/versions/multy_herr/lib/python3.7/site-packages/celery/app/task.py", line 552, in apply_async
link=link, link_error=link_error, **options)
File "/Users/sarit/.pyenv/versions/multy_herr/lib/python3.7/site-packages/celery/app/task.py", line 772, in apply
propagate=throw, app=self._get_app(),
File "/Users/sarit/.pyenv/versions/multy_herr/lib/python3.7/site-packages/celery/app/trace.py", line 295, in build_tracer
backend = task.backend
File "/Users/sarit/.pyenv/versions/multy_herr/lib/python3.7/site-packages/celery/app/task.py", line 1030, in backend
return self.app.backend
File "/Users/sarit/.pyenv/versions/multy_herr/lib/python3.7/site-packages/kombu/utils/objects.py", line 44, in __get__
value = obj.__dict__[self.__name__] = self.__get(obj)
File "/Users/sarit/.pyenv/versions/multy_herr/lib/python3.7/site-packages/celery/app/base.py", line 1207, in backend
return self._get_backend()
File "/Users/sarit/.pyenv/versions/multy_herr/lib/python3.7/site-packages/celery/app/base.py", line 925, in _get_backend
self.loader)
File "/Users/sarit/.pyenv/versions/multy_herr/lib/python3.7/site-packages/celery/app/backends.py", line 74, in by_url
return by_name(backend, loader), url
File "/Users/sarit/.pyenv/versions/multy_herr/lib/python3.7/site-packages/celery/app/backends.py", line 54, in by_name
cls = symbol_by_name(backend, aliases)
File "/Users/sarit/.pyenv/versions/multy_herr/lib/python3.7/site-packages/kombu/utils/imports.py", line 57, in symbol_by_name
module = imp(module_name, package=package, **kwargs)
File "/Users/sarit/.pyenv/versions/3.7.3/lib/python3.7/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 965, in _find_and_load_unlocked
ModuleNotFoundError: No module named "''"
Мой обходной путь будет if else
для вызова другой функции.
И условие CELERY_TASK_ALWAYS_EAGER == True
вызоветpn_list
если не звонить pn_list.delay(...)
Было бы очень здорово, если бы у Django и Celery4 была общая переменная для решения этой проблемы, как это было в Celery3
Вопрос:
Есть ли простой метод проверки pn_list
в serializer
, который используется viewsets
?