芹菜任务不会在 django 中执行

Posted

技术标签:

【中文标题】芹菜任务不会在 django 中执行【英文标题】:Celery task will not execute in django 【发布时间】:2022-01-21 00:58:51 【问题描述】:

我正在以 django 3 为例来学习 Django。我想用芹菜启动异步任务。我设置了设置,但任务不会执行。 我使用rabbit mq 作为代理,我使用的是windows。 这是我的代码:

芹菜.py

import os
from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Onlineshop.settings')

app = Celery('Onlineshop')

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

初始化.py

from .celery import app as celery_app

__all__ = ('celery_app',)

tasks.py

from celery import shared_task
from django.core.mail import send_mail
from .models import Order


@shared_task
def order_created(order_id):
    """Task to send an e-mail notification when order is successfully created."""
    order = Order.objects.get(id=order_id)
    subject = f'Order nr. order.id'
    message = f'Dear order.first_name,\n\n' \
              f' You have successfully placed an order.' \
              f'Your order ID is order.id'

    mail_sent = send_mail(subject, message, 'admin@onlineshop.com', [order.email])
    return mail_sent

views.py

from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from .models import OrderItem
from .forms import OrderCreateForm
from cart.cart import Cart
from .tasks import order_created


# Create your views here.
@login_required
def order_create(request):
    cart = Cart(request)
    if request.method == 'POST':
        user = request.user
        form = OrderCreateForm(request.POST)
        if form.is_valid():
            order = form.save(commit=False)
            order.user = user
            order.save()
            for item in cart:
                OrderItem.objects.create(order=order, product=item['product'], price=item['price'],
                                         quantity=item['quantity'])
            context = 
                'order': order,
            
            # clear the cart
            cart.clear()
            # launch asynchronous task
            order_created.delay(order.id)
            return render(request, 'order/created.html', context)
    else:
        form = OrderCreateForm()
    context = 'cart': cart,
               'form': form,
               
    return render(request, 'order/create.html', context)

这是我认为的问题,我调用了 order_created 函数,但任务不会执行,并且我的控制台中没有电子邮件。 我的电子邮件设置是正确的,因为我的应用程序中的其他电子邮件有效。 我使用花来监控 celery,在花面板中显示任务正在执行但没有电子邮件。 如果有任何机构可以提供帮助,我会很高兴

【问题讨论】:

请分享您的后端电子邮件设置。 我可以看看一些来自 celery 和 django 的日志以及你的 settings.py 到 celery 的日志吗?你 100% 确定这个 order_create 函数正在执行?附:我个人推荐在 docker 中使用 redis,但我不知道如何运行你的 rabbitmq。 @AbubakariUmarblacKrussainUma EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' @mka 这里是日志:[2021-12-18 17:08:44,616: INFO/MainProcess] celery@Matin 准备好了。 [2021-12-18 17:08:44,616: INFO/MainProcess] 任务 orders.tasks.order_created[f0a95270-b690-4812-a2ad-569e7fb4fd83] 收到 [2021-12-18 17:08:44,616: INFO/MainProcess]任务 orders.tasks.order_created[092f700d-d90d-4517-bd30-a6cba1bef509] 收到 [2021-12-18 17:08:44,616: INFO/MainProcess] 任务 orders.tasks.order_created [5863bbb4-516f-49b8-995b-68895560dedb ] 收到 是否有 celery 在单独的命令提示符下运行,而您的应用程序在另一个命令提示符下运行?因为查看您的控制台日志,任务已成功,您应该在运行应用程序的控制台中收到消息。 【参考方案1】:

好的,通过运行命令 Rabbitmq-server restart 并通过运行命令 Celery -A app_name worker --loglevel=info 让 celery 连接到服务器。试试这个任务调度器

@shared_task
def order_created(order_id):
    """ Task to send an e-mail notification when an order is successfully created"""
    order = Order.objects.get(id=order_id)
    subject = 'Order nr. '.format(order.id)
    message = 'Dear ,\n\nYou have sucsessfully placed an order. Your order id is '\
                  .format(order.first_name,order.id)
    
    mail_sent = send_mail(subject,
                           message,
                           'admin@onlineshop.com',
                            [order.email])
    
    return mail_sent 

【讨论】:

我试过了,但它不起作用 好的,尝试删除服务启动的 WAL 文件。使用 find /var/lib/rabbitmq/ -name "*.wal" 在 /var/lib/rabbitmq/mnesia 中找到 WAL 并将其删除。之后重启服务。确保您在单独的命令提示符下运行 celery,并在不同的命令提示符下运行您的应用程序。 我正在使用 windows 我没有这个目录 C:\Users\username\AppData\Roaming\RabbitMQ\db\rabbit@computername-mnesia\quorum\rabbit@computername 我已删除文件并再次运行它,但仍然没有电子邮件日志,但任务在 celery 日志中执行:[2021-12-19 11:56:32,864: INFO/MainProcess] 事件由远程启用的组 task。 [2021-12-19 11:56:51,707: INFO/MainProcess] 任务 orders.tasks.order_created[f18bfe64-28b8-4bc1-9d2e-968304832fd1] 收到@AbubakariUmarblacKrussainUma

以上是关于芹菜任务不会在 django 中执行的主要内容,如果未能解决你的问题,请参考以下文章

Django实现异步定时任务

Django 学习之Celery(芹菜)

为啥创建了芹菜任务但未收到

如何在 Django 应用程序中使用 celery 执行任务?

芹菜任务和自定义装饰器

芹菜任务消失