当我尝试执行命令celery -A novopagamento worker -l info
时,收到以下错误:
Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/celery/app/utils.py", line 365, in find_app
found = sym.app
AttributeError: module 'novopagamento' has no attribute 'app'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/local/bin/celery", line 11, in <module>
sys.exit(main())
File "/usr/local/lib/python3.6/site-packages/celery/__main__.py", line 16, in main
_main()
File "/usr/local/lib/python3.6/site-packages/celery/bin/celery.py", line 322, in main
cmd.execute_from_commandline(argv)
File "/usr/local/lib/python3.6/site-packages/celery/bin/celery.py", line 496, in execute_from_commandline
super(CeleryCommand, self).execute_from_commandline(argv)))
File "/usr/local/lib/python3.6/site-packages/celery/bin/base.py", line 273, in execute_from_commandline
argv = self.setup_app_from_commandline(argv)
File "/usr/local/lib/python3.6/site-packages/celery/bin/base.py", line 479, in setup_app_from_commandline
self.app = self.find_app(app)
File "/usr/local/lib/python3.6/site-packages/celery/bin/base.py", line 501, in find_app
return find_app(app, symbol_by_name=self.symbol_by_name)
File "/usr/local/lib/python3.6/site-packages/celery/app/utils.py", line 370, in find_app
found = sym.celery
AttributeError: module 'novopagemento' has no attribute 'celery'
我的项目结构:
novopagamento
├──novopagamento
| ├──__init__.py
| ├──settings.py
| └──celery.py
├──api
| └──tasks.py
我的芹菜文件:
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'novopagemento.settings')
app = Celery('novopagemento')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
我的任务文件:
from __future__ import absolute_import, unicode_literals
from celery import shared_task
@shared_task
def task_number_one():
#code
我的设置文件:
import os
# Other Celery settings
from celery.schedules import crontab
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# .
# .
# .
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # Django REST framework
'rest_framework.authtoken',
'rest_framework_swagger', # Swagger
'celery', # Celery
'api',
]
# .
# .
# .
# CELERY
CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Makassar'
CELERY_BEAT_SCHEDULE = {
'task-number-one': {
'task': 'api.tasks.task_number_one',
'schedule': crontab(minute=0, hour='*/3,10-19')
},
}
如果它很有趣,有我的docker-compose.yml:
db:
image: postgres
worker:
image: redis:4
web:
build: .
command: python novopagamento/manage.py migrate
command: python novopagamento/manage.py runserver 0.0.0.0:8000
stdin_open: true
tty: true
volumes:
- .:/code
ports:
- "8000:8000"
links:
- db
- worker
我按照本文中描述的步骤操作:
姜戈中的芹菜 4 周期性任务
感谢您的耐心和合作。 ;)
长镜头,但在 novopagamento/novopagamento/__init__.py 中,你设置了这个吗?
from __future__ import absolute_import, unicode_literals
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app
__all__ = ('celery_app',)
您需要在 task.py 中创建芹菜对象。将代理更改为您使用的代理
celery = Celery('tasks', broker='amqp://guest@localhost//')
配置可能会产生此问题。 取代:
CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
自:
BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis'
确保 Redis 服务器正在运行。