芹菜任务不会在 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 中执行的主要内容,如果未能解决你的问题,请参考以下文章