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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值