celery 在 get_scheduler 上击败了 TypeError

问题描述 投票:0回答:2

尝试使用 Supervisor 设置 Celery 运行

Python3.5
Django==1.10.2
celery==4.0.2
,但在
site-packages/celery/beat

上收到此错误
Traceback (most recent call last):
  File "/home/user_one/venv/app_one/bin/celery", line 11, in <module>
    sys.exit(main())
  File "/home/user_one/venv/app_one/lib/python3.5/site-packages/celery/__main__.py", line 14, in main
    _main()
  File "/home/user_one/venv/app_one/lib/python3.5/site-packages/celery/bin/celery.py", line 326, in main
    cmd.execute_from_commandline(argv)
  File "/home/user_one/venv/app_one/lib/python3.5/site-packages/celery/bin/celery.py", line 488, in execute_from_commandline
    super(CeleryCommand, self).execute_from_commandline(argv)))
  File "/home/user_one/venv/app_one/lib/python3.5/site-packages/celery/bin/base.py", line 281, in execute_from_commandline
    return self.handle_argv(self.prog_name, argv[1:])
  File "/home/user_one/venv/app_one/lib/python3.5/site-packages/celery/bin/celery.py", line 480, in handle_argv
    return self.execute(command, argv)
  File "/home/user_one/venv/app_one/lib/python3.5/site-packages/celery/bin/celery.py", line 412, in execute
    ).run_from_argv(self.prog_name, argv[1:], command=argv[0])
  File "/home/user_one/venv/app_one/lib/python3.5/site-packages/celery/bin/base.py", line 285, in run_from_argv
    sys.argv if argv is None else argv, command)
  File "/home/user_one/venv/app_one/lib/python3.5/site-packages/celery/bin/base.py", line 368, in handle_argv
    return self(*args, **options)
  File "/home/user_one/venv/app_one/lib/python3.5/site-packages/celery/bin/base.py", line 244, in __call__
    ret = self.run(*args, **kwargs)
  File "/home/user_one/venv/app_one/lib/python3.5/site-packages/celery/bin/beat.py", line 107, in run
    return beat().run()
  File "/home/user_one/venv/app_one/lib/python3.5/site-packages/celery/apps/beat.py", line 79, in run
    self.start_scheduler()
  File "/home/user_one/venv/app_one/lib/python3.5/site-packages/celery/apps/beat.py", line 98, in start_scheduler
    print(self.banner(service))
  File "/home/user_one/venv/app_one/lib/python3.5/site-packages/celery/apps/beat.py", line 120, in banner
    c.reset(self.startup_info(service))),
  File "/home/user_one/venv/app_one/lib/python3.5/site-packages/celery/apps/beat.py", line 130, in startup_info
    scheduler = service.get_scheduler(lazy=True)
  File "/home/user_one/venv/app_one/lib/python3.5/site-packages/celery/beat.py", line 567, in get_scheduler
    lazy=lazy,
TypeError: 'module' object is not callable

应用程序/settings.py

BROKER_URL = 'redis://:{}@{}:{}/{}'.format(redis_pass, redis_host, redis_port, redis_db)
CELERY_RESULT_BACKEND = 'redis://:{}@{}:{}/{}'.format(redis_pass, redis_host, redis_port, redis_celery_results_db)
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

应用程序/celery.py

from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app_one.settings')
cel_app = Celery('app_one')
cel_app.config_from_object('django.conf:settings')
cel_app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@cel_app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

我之前在其他项目中成功使用过 Celery,但没有在 Django 中使用过。我已按照此处指定的设置进行操作。我会不会漏掉了什么?

python django celery
2个回答
0
投票
万恶之源在于主管配置文件,即

/etc/supervisor/conf.d/celer_beat.conf:

command=/home/user_one/venv/app_one/bin/celery -A app_one beat --loglevel=INFO -S django

-S django

指的是我没有使用的django_celery_beat。所以这被改为:

command=/home/user_one/venv/app_one/bin/celery -A app_one beat -s /home/user_one/apps/app_one/celerybeat-schedule --loglevel=INFO

通过这种方式,celery 使用应用程序目录中的文件(即

/home/user_one/apps/app_one/

 目录)来跟踪时间表。


0
投票
我遇到了同样的问题,对我来说根本问题是项目中没有安装

django_celery_beat

  1. pip install django-celery-beat
    
    
  2. 确保
  3. INSTALLED_APPS
     包含 
    django_celery_beat
    
    
如果你想通过 django admin 安排定期任务,你将需要这个。

© www.soinside.com 2019 - 2024. All rights reserved.