Rabbitmq не показывает сообщения в django

Я читаю книгу Django 3 на примере и в главе 7 книги мы используем rabbitmq, celery и flower. Я настроил rabbitmq, celery и flower, но есть несколько проблем. Моя задача - это письмо, которое отправляется после создания заказа, задача выполняется в терминале celery и в панели flower, но я не могу увидеть письмо. и в панели rabbitmq сообщения не сохранены. и другая проблема в том, что вкладка брокера в flower пуста и не показывает rabbitmq. Вот скриншоты и мой код.

rabbitmq server is runnig

административная панель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

Вернуться на верх