【问题标题】:DJANGO celery task is executed from shell but it's not executed from viewDJANGO celery 任务是从 shell 执行的,但不是从视图中执行的
【发布时间】:2023-03-23 14:00:01
【问题描述】:

我正在尝试在我的 django 应用程序中使用 celery 创建一些异步任务

settings.py

BROKER_URL = 'django://localhost:6379/0'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

芹菜.py:

from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'provcon.settings')

app = Celery('provcon')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

项目__init__py:

from __future__ import absolute_import
from .celery import app as celery_app

tasks.py:

from __future__ import absolute_import
from celery import shared_task
from celery import task
from .models import Proc_Carga
@task()
def carga_ftp():
    tabla = Proc_Carga()
    sp = tabla.carga()

    return None

我这样称呼异步任务:

from .tasks import carga_ftp

@login_required(login_url='/login/')
def archivoview(request):
    usuario= request.user
    if request.method == 'POST':
       form = ProcFTPForm(usuario,request.POST)
       if form.is_valid():
          form.save()
          proc = Lista_Final()
          lista = proc.archivos()
          # call asynchronous task 
          carga_ftp.delay()
          return HttpResponseRedirect('/resumen/')
    else:
      form = ProcFTPForm(usuario)
    return render_to_response('archivo.html',{'form':form},context_instance=RequestContext(request))

当我从 python manage.py shell 运行任务时。执行worker并创建数据库对象没有任何问题

但是当我尝试从视图执行任务时,不工作不执行

知道为什么任务从 manage.py shell 运行而不是从视图运行

提前致谢

【问题讨论】:

    标签: python django django-views django-celery


    【解决方案1】:

    我也有同样的问题。 任务在 python shell 中工作,但在 Django 视图中不工作。

    我关注了这个 http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html

    我在 app.config_from_object 中缺少命名空间,添加 namespace='CELERY' 后,它工作正常。

    app.config_from_object('django.conf:settings', namespace='CELERY')
    

    【讨论】:

      【解决方案2】:

      检查redis是否正在运行

      $redis-cli ping
      

      检查 celery worker 是否在 django 管理界面运行

      如果没有运行则执行此命令

      celery -A provcon worker -l info
      

      从您的 django 应用程序测试您的任务

      如果作品像 daemon 一样在后台运行 celery worker

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-18
        • 1970-01-01
        • 2016-12-13
        • 2013-06-30
        • 1970-01-01
        相关资源
        最近更新 更多