【发布时间】: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 在单独的命令提示符下运行,而您的应用程序在另一个命令提示符下运行?因为查看您的控制台日志,任务已成功,您应该在运行应用程序的控制台中收到消息。
标签: python django django-views rabbitmq celery