使用 Celery 更新和部署到 Heroku 时,Django 模型未保存到数据库
Django models not being saved to database when updated using Celery and when deployed to Heroku
所以标题有点啰嗦,但我认为很好地解释了我的问题。
我有一个 Django 项目,它通过使用 Celery 和 RabbitMQ 从另一个网站抓取货币数据每 60 秒更新一次模型。当我 运行 在本地使用 celery worker 时,它工作得很好,但是当我部署到 Heroku 时,模型不会更新。
当我检查日志时 (heroku logs --tail) 它显示任务正在 运行ning 但它们没有更新数据库模型。我相信这一定是由于我的 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()
过程文件
web: gunicorn cryptoApi.wsgi --log-file -
worker: celery -A cryptoApi worker -l info
任何输入将不胜感激
我怀疑您正在使用 SQLite 作为数据库。 .
然而,关于这个的大多数问题呈现不同:它们看起来像是在工作,但随后数据在一段时间后丢失,当部署新代码时或在 dyno 重启后的第二天。
您 根本看不到新数据的原因 是 workers run on dedicated dynos,与您的 web
测功机分开,每个测功机都有自己的自己的 SQLite 数据库。您保存到一个的任何数据都不会在另一个上可见。
您必须切换到 client-server data store. Heroku's own Postgres service 通常是一个很好的起点。
所以标题有点啰嗦,但我认为很好地解释了我的问题。
我有一个 Django 项目,它通过使用 Celery 和 RabbitMQ 从另一个网站抓取货币数据每 60 秒更新一次模型。当我 运行 在本地使用 celery worker 时,它工作得很好,但是当我部署到 Heroku 时,模型不会更新。
当我检查日志时 (heroku logs --tail) 它显示任务正在 运行ning 但它们没有更新数据库模型。我相信这一定是由于我的 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()
过程文件
web: gunicorn cryptoApi.wsgi --log-file -
worker: celery -A cryptoApi worker -l info
任何输入将不胜感激
我怀疑您正在使用 SQLite 作为数据库。
然而,关于这个的大多数问题呈现不同:它们看起来像是在工作,但随后数据在一段时间后丢失,当部署新代码时或在 dyno 重启后的第二天。
您 根本看不到新数据的原因 是 workers run on dedicated dynos,与您的 web
测功机分开,每个测功机都有自己的自己的 SQLite 数据库。您保存到一个的任何数据都不会在另一个上可见。
您必须切换到 client-server data store. Heroku's own Postgres service 通常是一个很好的起点。