【发布时间】:2021-12-31 10:10:10
【问题描述】:
我正在通过示例书阅读 Django 3,在本书的第 7 章中,我们使用了rabbitmq、celery 和flower。 我配置了rabbitmq、celery 和flower,但有一些问题我的任务是在创建订单后发送的电子邮件,并且任务在celery 终端和花卉面板中执行,但我看不到电子邮件。在rabbitmq面板中,消息未被确认 另一个问题是花中的代理选项卡是空的,它不显示rabbitmq。 这是屏幕截图和我的代码。
这是我的tasks.py:
from __future__ import absolute_import, unicode_literals
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
celery 配置文件,celery.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')
broker = "amqp://test:test@localhost:5672/"
app = Celery('Onlineshop', broker=broker)
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print(f'Request: {self.request!r}')
花配置文件:
# RabbitMQ management api
broker_api = 'http://guest:guest@localhost:5672/api/'
# Enable debug logging
logging = 'DEBUG'
views.py:
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)
# set the order in the session
request.session['order_id'] = order.id
# redirect for payment
return redirect(reverse('payment:process'))
else:
form = OrderCreateForm()
context = {'cart': cart,
'form': form,
}
return render(request, 'order/create.html', context)
似乎一切正常,因为任务是在 celery 中收到的,并且它们也显示在 rabbitmq 面板消息中,但是没有确认,但我仍然无法在我的运行终端中看到电子邮件。 我的电子邮件设置是正确的,我正在使用 django 电子邮件后端。 我在 Windows 11 上并使用 celery v5.2.2 和 rabbitmq v3.9.11
【问题讨论】:
标签: python django rabbitmq celery flower