Модели Django не сохраняются в базе данных при обновлении с помощью Celery и при развертывании на Heroku
Так что название немного длинное, но я думаю, что оно довольно хорошо объясняет мою проблему.
У меня есть проект Django, который обновляет модели каждые 60 секунд путем соскабливания данных о валюте с другого сайта с помощью Celery и RabbitMQ. Когда я запускаю celery worker локально, он работает отлично, однако при развертывании на Heroku модели не обновляются
Когда я проверяю журналы (heroku logs --tail), он показывает, что задачи выполняются, но они не обновляют модели базы данных. Я полагаю, что это должно быть связано с ошибкой конфигурации в моем файле settings.py, но я перепробовал множество решений и ничего не помогло. Я также пробовал вместо этого использовать Redis и столкнулся с той же проблемой (он работает нормально в журналах, но фактически не обновляет базу данных).
Вот что, по моему мнению, является соответствующим кодом, который может вызывать проблему.
Settings.py (при использовании rabbitMQ):
CELERY_BROKER_URL = 'rabbitMQ_url_given_from_heroku'
BROKER_URL = os.environ.get("CELERY_BROKER_URL", "django://")
BROKER_POOL_LIMIT = 1
BROKER_CONNECTION_MAX_RETRIES = None
CELERY_TASK_SERIALIZER = "json"
CELERY_ACCEPT_CONTENT = ["json", "msgpack"]
Settings.py (при использовании Redis):
CELERY_BROKER_URL = 'Redis_url_given_from_heroku'
CELERRY_RESULT_BACKEND = 'django-db'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'UTC'
celery.py
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'cryptoApi.settings')
app = Celery('cryptoApi')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
Procfile
web: gunicorn cryptoApi.wsgi --log-file -
worker: celery -A cryptoApi worker -l info
Любой вклад будет высоко оценен
Я подозреваю, что вы используете SQLite в качестве базы данных. Это не будет работать так, как ожидается на Heroku.
Однако большинство вопросов, связанных с этим, возникают по-другому: они выглядят так, будто работают, но затем данные теряются спустя некоторое время, при развертывании нового кода или на следующий день после перезапуска динамо-машины.
Причина, по которой вы не видите новых данных вообще заключается в том, что рабочие работают на выделенных дино, отдельно от ваших web
дино, и у каждого дино будет своя база данных SQLite. Данные, которые вы сохраните на одном из них, не будут видны на других.
Вам придется перейти на клиент-серверное хранилище данных . Собственный сервис Heroku Postgres обычно является хорошей отправной точкой.