我在使用Celery,Redis和Django时遇到问题

时间:2019-07-31 09:05:25

标签: django redis task celery django-settings

我在使用Celery,Redis和Django时遇到问题。

我正在尝试使用它们来创建一个简单的任务。

但是,执行任务后不久就会发生错误。

我将在下面的代码中指定部分以便更好地理解。感谢您的关注。

CELERY_BROKER_URL = 'redis://:password@REDIS:6379/0'
CELERY_RESULT_BACKEND = 'redis://REDIS:6379/0'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_TIMEZONE = 'America/Recife'
CELERY_BEAT_SCHEDULE = {
    'task-send': {
        'task': 'app.tasks.task_send_email',
        'schedule': crontab(hour=5, minute=44)
    }
}

控制台芹菜

[config]
app:         sistema:0x7fa254a5d6f4
transport:   redis://:**@redis:6379/0
results:     redis://redis:6379/0
concurrency: 1 (prefork)
task events: OFF (enable -E to monitor tasks in this worker)

[queues]
exchange=celery(direct) key=celery

[tasks]
app.tasks.task_send_email

INFO/MainProcess] Connected to redis://:**@redis:6379/0
INFO/MainProcess] mingle: searching for neighbors
INFO/MainProcess] mingle: all alone

执行任务后发生错误

RuntimeWarning: Exception raised outside body: ResponseError('NOAUTH Authentication required.',):

任务未完成。

1 个答案:

答案 0 :(得分:2)

考虑到您的结果后端URL不具有身份验证令牌,并且您使用的服务器显然与预期相同,因此我认为正在发生以下情况:您可以成功运行任务(因为后端URL是正确的),但是一旦任务运行,Celery就会尝试将结果存储在结果后端中,但是由于结果后端URL无效(redis://redis:6379/0,应类似于代理,即redis://:**@redis:6379/1-使用数据库名称不同)Celery引发异常,因为它无法连接到Redis(NOAUTH Authentication required来自Redis服务器)。

假设您的Redis服务器为redis.local,而您的Redis身份验证令牌为my53cr3tt0ken。您的Celery配置应具有以下两个:

broker_url = "redis://:my53cr3tt0ken@redis.local:6379/0"
celery_result_backend = "redis://:my53cr3tt0ken@redis.local:6379/1"

注意,我对经纪人和结果后端使用不同的数据库-我建议您也这样做。

如果您的Redis加密通信,则应使用rediss://...