安装rabbitmq
cenos7
- 安装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
- 安装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
-
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
下单,就会收到邮件