无法在 Django 中调用 Celery
Can't call Celery in Django
所以问题是,当我尝试从 Django lpr.views.py
页面调用 main 任务时,显示正在加载图标,仅此而已,没有其他任何事情发生。 Django 或 Celery 控制台中没有输出。当我尝试 运行 来自 python shell 的任务时,它 运行 没有问题并将结果保存在数据库中。我添加 add 任务用于测试目的,当我 运行 add 任务时 returns 由于缺少 'y' 参数是正常的。但是 main 任务是怎么回事?
有我的代码以防万一。
项目结构:
Project
├── acpvs
│ ├── celery.py
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── db.sqlite3
├── lpr
│ ├── __init__.py
│ ├── tasks.py
│ ├── urls.py
│ └── views.py
└── manage.py
settings.py
import djcelery
INSTALLED_APPS = [
...
'djcelery',
'django_celery_results',
]
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'django-db'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_ALWAYS_EAGER = False
djcelery.setup_loader()
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 acpvs.celery import app as celery_app
__all__ = ['celery_app']
acpvs.celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'acpvs.settings')
app = Celery('acpvs')
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
lpr.tasks.py
from __future__ import absolute_import, unicode_literals
from celery import shared_task
from djcelery import celery
@shared_task
def add(x, y):
return x + y
@shared_task
def main():
...
args = {
'imageName': imageName,
'flag': True
}
return args
lpr.urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^t/$', views.test_add),
url(r'^t1/$', views.test_main),
]
lpr.views.py
from . import tasks
from django.http import HttpResponse
def test_add(request):
result = tasks.add.delay()
return HttpResponse(result.task_id)
der test_main(request):
result = tasks.main.delay()
return HttpResponse(result.task_id)
更新
在我看来,我集成 Celery 的方式仍然存在问题。当我从 views.py 中删除 .delay()
时,它可以工作,但当然不是异步的,也没有使用 Celery。
delay()实际上是异步执行任务,请确认是否更新了db中的值,
我认为它会更新 db 中的值(如果 main 方法正在执行)但不会 return 值,因为客户端将消息添加到队列,然后代理会传递该值给工作人员的消息,然后工作人员执行 main
的操作
所以我通过删除所有 djcelery 实例并将 Django 从 1.11 升级到 2.0.3 来让它工作
顺便说一句,我使用的是 Celery 4.1.0
所以问题是,当我尝试从 Django lpr.views.py
页面调用 main 任务时,显示正在加载图标,仅此而已,没有其他任何事情发生。 Django 或 Celery 控制台中没有输出。当我尝试 运行 来自 python shell 的任务时,它 运行 没有问题并将结果保存在数据库中。我添加 add 任务用于测试目的,当我 运行 add 任务时 returns 由于缺少 'y' 参数是正常的。但是 main 任务是怎么回事?
有我的代码以防万一。
项目结构:
Project
├── acpvs
│ ├── celery.py
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── db.sqlite3
├── lpr
│ ├── __init__.py
│ ├── tasks.py
│ ├── urls.py
│ └── views.py
└── manage.py
settings.py
import djcelery
INSTALLED_APPS = [
...
'djcelery',
'django_celery_results',
]
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'django-db'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_ALWAYS_EAGER = False
djcelery.setup_loader()
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 acpvs.celery import app as celery_app
__all__ = ['celery_app']
acpvs.celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'acpvs.settings')
app = Celery('acpvs')
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
lpr.tasks.py
from __future__ import absolute_import, unicode_literals
from celery import shared_task
from djcelery import celery
@shared_task
def add(x, y):
return x + y
@shared_task
def main():
...
args = {
'imageName': imageName,
'flag': True
}
return args
lpr.urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^t/$', views.test_add),
url(r'^t1/$', views.test_main),
]
lpr.views.py
from . import tasks
from django.http import HttpResponse
def test_add(request):
result = tasks.add.delay()
return HttpResponse(result.task_id)
der test_main(request):
result = tasks.main.delay()
return HttpResponse(result.task_id)
更新
在我看来,我集成 Celery 的方式仍然存在问题。当我从 views.py 中删除 .delay()
时,它可以工作,但当然不是异步的,也没有使用 Celery。
delay()实际上是异步执行任务,请确认是否更新了db中的值, 我认为它会更新 db 中的值(如果 main 方法正在执行)但不会 return 值,因为客户端将消息添加到队列,然后代理会传递该值给工作人员的消息,然后工作人员执行 main
的操作所以我通过删除所有 djcelery 实例并将 Django 从 1.11 升级到 2.0.3 来让它工作
顺便说一句,我使用的是 Celery 4.1.0