我使用django-money,然后我运行celery beat每60分钟更新一次货币汇率,代码如下。* 我关注了django-money doc:
# "core/celery.py"
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings')
app = Celery('core')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print(f'Request: {self.request!r}')
# "core/tasks.py"
from celery import shared_task
from djmoney import settings
from django.utils.module_loading import import_string
@shared_task
def update_rates(backend=settings.EXCHANGE_BACKEND, **kwargs):
backend = import_string(backend)()
backend.update_rates(**kwargs)
print("Successfully updated")
# "core/settings.py"
from celery.schedules import crontab
OPEN_EXCHANGE_RATES_APP_ID = '5507ba2d9b8f4c46adca3169aef9c281' # Here
CELERY_BEAT_SCHEDULE = {
'update_rates': {
'task': 'core.tasks.update_rates',
'schedule': crontab(minute='*/60'),
'kwargs': {} # For custom arguments
}
}
但是,即使我在settings.py
中设置了OPEN_EXCHANGE_RATES_APP_ID
,也会出现下面的错误:
django.core.exceptions.ImproperlyConfigured:设置。OPEN_EXCHANGE_RATES_APP_ID应设置为使用OpenExchangeRatesBackend
那么,我如何解决每60分钟用celery 跳动更新货币汇率的错误?
1条答案
按热度按时间toe950271#
您需要将
OPEN_EXCHANGE_RATES_APP_ID
传递给update_rates
任务,其中'args'
在settings.py
中,如下所示。* 实际上,在django-money doc中更新货币汇率的celery beat示例是旧的:然后,
update_rates
任务需要用app_id
接收OPEN_EXCHANGE_RATES_APP_ID
,然后将其分配给tasks.py
中的access_key
,如下图所示,然后可以解决错误,然后每60分钟更新一次货币汇率。* 您可以在GitHub上看到openexchangerates.py,以了解为什么OPEN_EXCHANGE_RATES_APP_ID
需要分配给access_key
:此外,
OPEN_EXCHANGE_RATES_APP_ID
可以在settings.py
中的celery beat代码之后定义,如下所示,没有任何错误,我建议在celery beat代码之前导入crontab
,如下所示,这样就不会发生错误:并且,您可以在
settings.py
上使用新的celery beat代码,如下所示。*app
和update_rates
任务需要分别从core/celery.py
和core/tasks.py
导入,如下所示,我建议在新的celery 节拍代码之前导入crontab
,app
和update_rates
,如下所示,这样就不会发生错误: