django+rabbitmq+celery异步发送邮件

安装rabbitmq

cenos7

  1. 安装elang
下载elang
wget --content-disposition https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-23.3.4.11-1.el7.x86_64.rpm/download.rpm
安装elang
yum localinstall erlang-23.3.4.11-1.el7.x86_64.rpm
  1. 安装rabbitmq
下载:
wget --content-disposition https://packagecloud.io/rabbitmq/rabbitmq-server/packages/el/7/rabbitmq-server-3.10.0-1.el7.noarch.rpm/download.rpm
安装:
rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
yum localinstall rabbitmq-server-3.10.0-1.el7.noarch.rpm
  1. rabbitmq设置

    启动rabbitmq
    
常用命令:
systemctl start rabbitmq-server 启动
systemctl restart rabbitmq-server  重启
systemctl enable rabbitmq-server  开机自启
systemctl status rabbitmq-server  查看状态
		安装web端的客户端插件,并且重启rabbitmq
安装web端的客户端插件,之后重启,在运行后面命令
rabbitmq-plugins enable rabbitmq_management
添加远程用户
rabbitmqctl add_user admin admin
修改用户角色
rabbitmqctl set_user_tags admin administrator
添加权限
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
rabbitmqctl add_vhost /
	开放防火墙端口15672、5672
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports

输入账户密码登录,IP改成rabbit所在服务器IP,端口就是15672,进入之后如下图所示
在这里插入图片描述

在django项目安装celery

django工程和应用创建在此不赘述

pip install celery #celery
pip install flower #celery监控
pip install gevent #window启动cerely,保证任务正常执行successfully
pip install django-celery

我的项目是一个商城,订单系统下单之后异步发出一个邮件,下面是项目结构
orders是订单系统,下单操作在view.py进行,异步任务也就是邮件发送也在在订单系统实现
在这里插入图片描述
首先在myshop中创建 celery.py,写入下面代码

import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myshop.settings')
app = Celery('myshop')#项目名称,后面也会用到,不能错

app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

seettings文件写入以下代码

163邮箱设置:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.163.com'
EMAIL_PORT = 465
EMAIL_HOST_USER = 'xxx@163.com'
EMAIL_HOST_PASSWORD = 'xxxx'#邮箱授权码
EMAIL_USE_SSL = True
EMAIL_USE_TLS = False
DEFAULT_FROM_EMAIL = 'xxx9531@163.com'

# Celery Config
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_BROKER_URL = 'amqp://admin:admin@192.168.233.4:5672'     # 将rabbitmq 用户名、密码和IP替换为你的环境
# CELERY_RESULT_BACKEND = 'redis://192.168.233.4:6379/1'  # 将rabbitmq 用户名、密码和IP替换为你的环境

myshop的__init__.py写入

# import celery
from .celery import app as celery_app

编写异步任务-发送邮件
order中新建tasks.py,写入以下代码:

from celery import shared_task
from django.core.mail import send_mail
from .models import Order
from django.conf import settings


@shared_task
def order_created(order_id):
    print('发送邮件')
    order = Order.objects.get(id=order_id)
    subject = f'Order nr. {order.id}'
    message = f'Dear {order.first_name},\n\nYour have successfully placed an order.Your order ID is {order.id}'
    from_email = settings.EMAIL_HOST_USER
    print(from_email)
    recipient_list = [order.email]
    print(recipient_list)
    mail_sent = send_mail(subject, message, from_email, recipient_list)
    print('发送成功')
    return mail_sent

orders的view.py中调用邮件发送,写入以下代码

from django.shortcuts import render
from .forms import OrderCreateForm
from .models import OrderItem
from cart.cart import Cart
from .tasks import order_created
# Create your views here.


def order_create(request):
    cart = Cart(request)
    if request.method == 'POST':
        form = OrderCreateForm(request.POST)
        if form.is_valid():
            # 生成新的订单但
            order = form.save()
            for item in cart:
                OrderItem.objects.create(order=order,
                                         product=item['product'],
                                         quantity=item['quantity'],
                                         price=item['price'])
            cart.clear()
            #发送邮件
            **rder_created.delay(order.id)**
            html = 'orders/order/created.html'
            datas = {'order': order}
            return render(request, html, datas)
    else:
        form = OrderCreateForm()
    html = 'orders/order/create.html'
    datas = {'form': form, 'cart': cart}
    return render(request, html, datas)

启动cerely

启动celery
celery -A myshop worker -l info -P gevent
启动celery监控,后续访问http://localhost:5555
celery -A myshop  flower

下单,就会收到邮件
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Django Celery 是一个用于 Django 框架的分布式任务队列工具。它结合了 Django 的 Web 开发能力和 Celery 的异步任务处理能力。通过使用 Celery,你可以将耗时的任务(如发送电子邮件、处理图像、执行定时任务等)从主线程中分离出来,以提高应用的性能和响应速度。 你可以通过以下步骤来集成 DjangoCelery: 1. 安装 Celery:在命令行中使用 pip 安装 Celery 库:`pip install celery` 2. 配置 Celery:在 Django 项目的 settings.py 文件中配置 Celery 相关的设置,主要包括消息代理器(message broker)的设置和任务结果存储的设置。 3. 创建任务:在 Django 项目中创建需要异步执行的任务。任务是一个 Python 函数,使用 `@task` 装饰器进行标记。 4. 启动 Celery Worker:在命令行中使用 `celery -A your_project_name worker --loglevel=info` 启动 Celery Worker,该命令会监听并执行任务队列中的任务。 5. 触发任务:在你的 Django 代码中调用任务函数,可以使用 `your_task.delay()` 来触发异步执行任务。 这样,当你触发任务时,它会被添加到 Celery 的任务队列中,并由 Celery Worker 异步执行。执行结果可以存储在指定的结果存储中,也可以通过回调函数获取。 注意:配置消息代理器和结果存储器时,你可以选择使用不同的后端,如 RabbitMQ、Redis、Amazon SQS 等。 以上是关于 Django Celery 的简要介绍和基本使用步骤,如果你有具体问题或需要更详细的指导,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值