Django-Celery перестал работать после переключения ветвей
Я использовал cookiecutter-django для создания своего Django проекта с celery=yes и docker=yes. Я потратил некоторое время на изменение конфигурации/структуры Celery в соответствии с руководством HackSoftware Django Guidelines для Celery. Мне потребовалось время, чтобы во всем разобраться, но в конце концов я добился того, что все заработало с примером задачи, которая просто записывает в журнал несколько строк.
Это было сделано на ветви feature. Итак, как только я убедился, что все в порядке, я зафиксировал и продвинул свои изменения и объединил PR с основной веткой. Вернувшись в терминал, я переключился на Main и вытащил изменения. В этот момент не должно быть различий между моей веткой main и моей веткой configure_celery. Однако, когда я поднял все контейнеры, моя задача-образец больше не выполнялась.
Я потратил много часов, пробуя различные вещи, чтобы заставить его работать безрезультатно. Я снес контейнеры, обрезал все с помощью docker system prune -a, использовал Docker Desktop, чтобы вручную очистить все тома, попробовал другую конфигурацию Redis db, вернулся к моей ветке configure_celery и ничего не сработало.
Я вижу, что рабочий успешно обнаруживает мою задачу:
Все контейнеры выглядят счастливыми, и их службы запущены:
brew_dash_local_celeryworker "/entrypoint /start-…" celeryworker running
brew_dash_local_django "/entrypoint /start" django running 0.0.0.0:8000->8000/tcp
brew_dash_local_flower "/entrypoint /start-…" flower running 0.0.0.0:5555->5555/tcp
brew_dash_local_mailhog "MailHog" mailhog running 0.0.0.0:8025->8025/tcp
brew_dash_local_postgres "docker-entrypoint.s…" postgres running 0.0.0.0:5432->5432/tcp
brew_dash_local_redis "docker-entrypoint.s…" redis running 6379/tcp
Мой конфиг находится по адресу project/brew_dash/tasks/apps.py:
import os
from celery import Celery
from django.apps import AppConfig
# set the default Django settings module for the 'celery' program.
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")
app = Celery("brew_dash")
# TODO add a periodic task script like here: https://github.com/HackSoftware/Django-Styleguide#periodic-tasks. This
# will be really handy for deployments
class TasksConfig(AppConfig):
"""Most of the config is based on the HackSoftware Django-Styleguidelines:
https://github.com/HackSoftware/Django-Styleguide#celery"""
name = "brew_dash.tasks"
verbose_name = "Celery Config"
def ready(self):
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object("django.conf:settings", namespace="CELERY")
# Load task modules from all registered Django app configs.
# Each app that will have tasks need to have its tasks file registered in AppConfig
# Per: https://cheat.readthedocs.io/en/latest/django/celery.html
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
from celery.utils.log import base_logger
base_logger = base_logger
base_logger.debug("debug message")
base_logger.info("info message")
base_logger.warning("warning message")
base_logger.error("error message")
base_logger.critical("critical message")
print("Request: {0!r}".format(self.request))
return 42
project/config/init.py
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from brew_dash.tasks.apps import app as celery_app
__all__ = ("celery_app",)
project/integrations/tasks.py:
from celery import shared_task
from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)
@shared_task
def sample_task():
logger.info("***********************************************************")
logger.info("***********************************************************")
logger.info("The sample task just ran ****************")
logger.info("***********************************************************")
project/brew_dash/integrations/apps.py:
class IntegrationsConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "brew_dash.integrations"
def ready(self):
import brew_dash.integrations.tasks # NOQA
Я создал интервал, который запускается каждые 15 секунд в приложении Django admin, и привязал его к периодической задаче sample_task, которую обнаруживает рабочий. Все это работало до того, как я выложил свои изменения, объединил и попробовал запустить на основной ветке. Я проделал все известные мне способы устранения неполадок, так что я ищу совета. Спасибо!