【问题标题】:Rabbitmq not showing messages in djangoRabbitmq 没有在 django 中显示消息
【发布时间】:2021-12-31 10:10:10
【问题描述】:

我正在通过示例书阅读 Django 3,在本书的第 7 章中,我们使用了rabbitmq、celery 和flower。 我配置了rabbitmq、celery 和flower,但有一些问题我的任务是在创建订单后发送的电子邮件,并且任务在celery 终端和花卉面板中执行,但我看不到电子邮件。在rabbitmq面板中,消息未被确认 另一个问题是花中的代理选项卡是空的,它不显示rabbitmq。 这是屏幕截图和我的代码。

rabbitmq server is runnig

rabbitmq admin panel

flower panel

celery logs

这是我的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


    【解决方案1】:

    它在您的屏幕截图中声明任务已收到,但执行阶段似乎从未发生,我建议您检查的是,当您的 celery worker 启动时,它将列出该 worker 识别的所有 celery 任务的列表存在。在启动工作器时首先更新您的日志记录,celery -A Onlineshop worker -Q celery,emailQueue --loglevel=INFO。如果在 celery worker 启动时任务 order_created 从未列出,那么这表明当 celery worker 启动时导入存在问题,并且可能需要更新 python 模块的 __init__.py 以自动导入 celery 任务。

    发生这种情况的另一个可能原因是 celery 任务可能被分配到工作人员未在侦听的队列中。我会检查您在启动 celery worker 时的参数是否包含所有正确的队列名称。 celery -A Onlineshop worker -Q celery,emailQueue

    【讨论】:

    • 我试过你说的,order_created 任务被列出来了。我不知道是什么问题
    • @MatinNajafi 如果任务被列出,我还建议检查后台没有任何挂起的工作人员在运行,仔细检查活动监视器并终止所有与 python 相关的进程并重新启动机器。跨度>
    猜你喜欢
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 2012-08-03
    相关资源
    最近更新 更多