文章目录
Celery/容联云 安装与命令
celery,分布式异步任务队列
eventlet,并发网络库 gevent 协程库
ronglian_sms_sdk 容联云封装的方法
安装
pip install celery==4.4.7
pip install eventlet==0.26.1
pip install ronglian-sms-sdk
celery启动命令
celery -A 项目名 worker -l info -P eventlet
一、Celery
1.配置Celery
在项目同名文件夹下创建celery.py 文件
# 导入celery 导入 settings配置文件
from celery import Celery
import os
from django.conf import settings
# 配置环境变量 celery的worker进程是脱离django启动, 但是依赖其配置文件
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'p6_421.settings')
# 创建celery应用app Worker工人,执行任务的人 myworker
app = Celery('myworker')
# 配置app
app.conf.broker_url = 'redis://:@127.0.0.1:6379/5' # 相当于数据结构中的队列, Broker把任务暂时放到队列中,等待Worker来处理。
app.conf.result_backend = 'redis://:@127.0.0.1:6379/6' # Backend 用于保存任务的执行结果
# 发现任务函数 autodiscover_tasks自动发现任务
app.autodiscover_tasks(settings.INSTALLED_APPS)
# app.autodiscover_tasks(['learnproject.utils.celery.tasks'])
2.创建任务文件
App users文件夹下创建tasks.py 文件 Task任务
文件内存放要异步处理的任务
二、容联云
1. 配置容联云 settings.py
accId = ‘容联云通讯分配的主账号ID’
accToken = ‘容联云通讯分配的主账号TOKEN’
appId = ‘容联云通讯分配的应用ID’
settings.py文件配置
ACCID = '8a216da8804ba8a50180x64a39933069b'
ACCTOKEN = '09880a5e3fc94x046b3cc147e240ad169'
APPID = '8a216dax8804ba8a5018064a39a3706a2'
2. 使用SmsSDK发送短信
在App users文件夹下的tasks.py 文件里编写
tasks.py文件
from ronglian_sms_sdk import SmsSDK
from p6_421 import settings
from p6_421.celery import app
# 借助容联运短信验证码
@app.task
def send_message(sms_code, mobile, expire=5): # expire=5 5分钟过期
# 实例化sdk
sdk = SmsSDK(settings.ACCID, settings.ACCTOKEN, settings.APPID)
# 组织数据
tid = '1' #容联云的短信模板ID
mobile = "%s" % mobile
datas = ("%s" % sms_code, "%s" % expire) # 第一个:短信验证码 第二个: 多久过期
# 发送短信 并接收响应
res = sdk.sendMessage(tid=tid, mobile=mobile, datas=datas)
return res
三、视图编写
1.发送短信验证码
# 生成短信验证码 请求容联云 发送短信 异步
class SmsView(APIView):
def post(self, request):
mobile = request.data.get('mobile')
uuid_ = request.data.get('uuid')
# 2 生成短信验证码 并redis存储 方便验证
sms_code = '%d' % random.randint(10000, 99999)
redis_cli = redis.Redis()
redis_cli.set(uuid_, sms_code, ex=300)
# 3 请求容联云 发送短信 .delay 异步执行任务
res = send_message.delay(sms_code, mobile)
return Response({'code': 200, 'msg': '短信已发送,注意查收!'})
2.验证短信验证码(根据前端要求)
# 验证短信验证码
class CheckSmsView(APIView):
def post(self, request):
sms_code = request.data.get('sms_code')
uuid_ = request.data.get('code_id')
# 查询redis 拿出存储的短信验证码stored_sms_code
redis_cli = redis.Redis()
stored_sms_code = redis_cli.get(uuid_)
# 判断 存在&解码后=前端验证码
if stored_sms_code and stored_sms_code.decode() == sms_code:
return Response({'code': 200, 'msg': '对比成功'})
else:
return Response({'code': 400, 'error': '对比失败'})
3.先启动django项目 然后另开终端启动celery 服务
celery -A (celery配置文件路径) worker -l info -P eventlet
例:
celery -A learnproject.utils.celery.celery_main worker -l info
-P eventlet
learnproject.utils.celery.celery_main
learnproject 项目的同名文件夹
utils 同名文件夹下的文件夹
celery 同名文件夹下的文件夹
celery_main 配置celery主要信息的py文件