Невозможно настроить форматер 'json': Cannot resolve 'app_name.utils.logging.JSONFormatter': cannot import name 'Celery'
Я пытаюсь включить celery в наше приложение Django и испытываю трудности с настройкой.
Пока что все мои поиски в stackoverflow/google говорят мне, что у меня есть круговая зависимость, но я не могу ее увидеть. В документации, https://docs.celeryproject.org/en/stable/getting-started/first-steps-with-celery.html, явно используется from celery import Celery
Я определил:
app_name/app_name_celery.py
с
from celery import signals, Celery
import os
from django.conf import settings
# disable celery logging so that it inherits from the configured root logger
@signals.setup_logging.connect
def setup_celery_logging(**kwargs):
pass
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")
# Create default Celery app
app = Celery('app_name')
# namespace='CELERY' means all celery-related configuration keys
# should be uppercased and have a `CELERY_` prefix in Django settings.
# https://docs.celeryproject.org/en/stable/userguide/configuration.html
app.config_from_object("django.conf:settings", namespace="CELERY")
# When we use the following in Django, it loads all the <appname>.tasks
# files and registers any tasks it finds in them. We can import the
# tasks files some other way if we prefer.
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
Дополнительно я определил app_name/my_app_config.py
с
from django.apps import AppConfig
class MyAppConfig(AppConfig):
# ...
def ready(self):
# Import celery app now that Django is mostly ready.
# This initializes Celery and autodiscovers tasks
import app_name.app_name_celery
Последнее, что я добавил к своему __init__.py
:
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .app_name import app as celery_app
__all__ = ('celery_app',)
Кроме того, настройка протоколирования не изменилась для этого pr, но вот она:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'json': {
'()': 'app_name.utils.logging.JSONFormatter'
}
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'json'
}
},
'loggers': {
'ddtrace': {
'level': 'WARNING'
}
},
'root': {
'level': 'DEBUG',
'handlers': ['console']
}
}
Может ли кто-нибудь увидеть круговую зависимость или что еще я могу упустить?
Вы пытаетесь импортировать настройки django на
app_name/app_name_celery.py
from celery import signals, Celery
import os
from django.conf import settings # This line here
Также вам не нужно импортировать celery в конфигурацию вашего приложения.
Auto discover находит задачи в app/tasks.py, app_2/tasks.py и т.д.