Rabbitmq не показывает сообщения в django
Я читаю книгу Django 3 на примере и в главе 7 книги мы используем rabbitmq, celery и flower. Я настроил rabbitmq, celery и flower, но есть несколько проблем. Моя задача - это письмо, которое отправляется после создания заказа, задача выполняется в терминале celery и в панели flower, но я не могу увидеть письмо. и в панели rabbitmq сообщения не сохранены. и другая проблема в том, что вкладка брокера в flower пуста и не показывает 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}')
flowr config file:
# 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 панели сообщений, но там есть unacked, но все еще я не могу увидеть электронную почту в моем терминале запуска. Мои настройки Email верны и я использую почтовый бэкенд django. Я работаю на windows 11 и использую celery v5.2.2 и rabbitmq v3.9.11
На вашем скриншоте указано, что задание получено, но фаза выполнения так и не наступает, я бы рекомендовал проверить, что при запуске вашего celery worker он выдает список всех заданий celery, о существовании которых он узнал. Сначала обновите журнал регистрации при запуске рабочего, celery -A Onlineshop worker -Q celery,emailQueue --loglevel=INFO
. Если задача order_created
никогда не указывается в списке при запуске celery worker, это указывает на то, что существует проблема с импортом при запуске celery worker, и, возможно, необходимо обновить __init__.py
для модуля python, чтобы он автоматически импортировал задачу celery.
Другая возможная причина, по которой это может произойти, заключается в том, что задача celery может быть назначена на очередь, которую рабочий не прослушивает. Я бы проверил, что ваши аргументы при запуске celery worker включают все правильные имена очередей. celery -A Onlineshop worker -Q celery,emailQueue