前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【愚公系列】2022年01月 Django商城项目08-注册界面-短信验证码

【愚公系列】2022年01月 Django商城项目08-注册界面-短信验证码

作者头像
愚公搬代码
发布2022-01-14 10:36:28
8150
发布2022-01-14 10:36:28
举报
文章被收录于专栏:历史专栏

文章目录

一、短信验证码

1.celery消息中间件

1.1celery的相关概念

Celery由以下三部分构成:消息中间件(Broker)、任务执行单元Worker、结果存储(Backend)

在这里插入图片描述
在这里插入图片描述

工作原理:

  • 任务模块Task包含异步任务和定时任务。其中,异步任务通常在业务逻辑中被触发并发往消息队列,而定时任务由Celery Beat进程周期性地将任务发往消息队列;
  • 任务执行单元Worker实时监视消息队列获取队列中的任务执行;
  • Woker执行完任务后将结果保存在Backend中;

消息中间件Broker

消息中间件Broker官方提供了很多备选方案,支持RabbitMQ、Redis、Amazon SQS、MongoDB、Memcached 等,官方推荐RabbitMQ。

任务执行单元Worker

Worker是任务执行单元,负责从消息队列中取出任务执行,它可以启动一个或者多个,也可以启动在不同的机器节点,这就是其实现分布式的核心。

结果存储Backend

Backend结果存储官方也提供了诸多的存储方式支持:RabbitMQ、 Redis、Memcached,SQLAlchemy, Django ORM、Apache Cassandra、Elasticsearch。

1.2celery的使用

代码语言:javascript
复制
pip install selery #消息队列异步发送
pip install ronglian_sms_sdk #短信平台sdk

主文件:创建实例,加载配置文件,检测任务

代码语言:javascript
复制
"""
Celery 将这三者串联起来

生产者         队列           消费者

1. 创建celery

2. 设置队列(broker)

3. 设置生产者(任务 task)
        ① 任务的本质就是函数
        ② 这个函数必须要被celery的实例对象的 task装饰器装饰
        ③ 必须调用celery实例对象的自动检测来检测任务

4. 设置消费者(worker)
    celery -A celery实例对象的文件 worker -l info -p eventlet

	celery -A celery_tasks.main worker -l info -P gevent
"""


#① 让celery去加载我们当前工程中的配置文件
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "meiduo_mall.settings")

#② 创建celery实例对象
from celery import Celery
# celery的第一个参数是main
# 习惯上,填写当前脚本的工程名就可以
# 给celery的实例起个名字,这个名字唯一就可以
app = Celery('celery_tasks')

#③ celery 设置 broker (队列)
# config_from_object 参数: 就是 配置文件的路径
app.config_from_object('celery_tasks.config')


#④ 让celery自动检测任务
#autodiscover_tasks 参数是 列表
# 列表的元素是: 任务的包路径
app.autodiscover_tasks(['celery_tasks.sms'])

配置文件

代码语言:javascript
复制
##!/usr/bin/env python3
## -*- coding:utf-8 -*-
## Author:wd

#from project import app
#from celery.schedules import crontab

#BROKER_URL = 'redis://10.1.210.69:6379/0' # Broker配置,使用Redis作为消息中间件

#CELERY_RESULT_BACKEND = 'redis://10.1.210.69:6379/0' # BACKEND配置,这里使用redis

#CELERY_RESULT_SERIALIZER = 'json' # 结果序列化方案

#CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24 # 任务过期时间

#CELERY_TIMEZONE='Asia/Shanghai'   # 时区配置

#CELERY_IMPORTS = (     # 指定导入的任务模块,可以指定多个
#    'project.tasks',
#    'project.period_task',
#)

#app.conf.beat_schedule = {
#    'period_add_task': {    # 计划任务
#        'task': 'project.period_task.add',  #任务路径
#        'schedule': crontab(hour=18, minute=16, day_of_week=1),
#        'args': (3, 4),
#    },
#'add-every-30-seconds': {          # 每10秒执行
#        'task': 'project.period_task.sayhi',  #任务路径
#        'schedule': 10.0,
#        'args': ('wd',)
#    },
#}


# 我们选择的是redis作为我们的 队列
# 选择redis的 14号库
broker_url = "amqp://guest@localhost//"
#broker_url = "redis://127.0.0.1/14"
# 结果选择15号库
result_backend = "redis://127.0.0.1/15"

任务模块

代码语言:javascript
复制
"""
① 任务的本质就是函数
② 这个函数必须要被celery的实例对象的 task装饰器装饰
③ 必须调用celery实例对象的自动检测来检测任务
"""
from celery_tasks.main import app
tid = 1 #默认模板
accId = ''#填写自己的
accToken = ''#填写自己的
appId = ''#填写自己的
from ronglian_sms_sdk import SmsSDK
@app.task
def send_sms_code(mobile,sms_code):
    sdk = SmsSDK(accId, accToken, appId)
    datas = (str(sms_code),'2')
    resp = sdk.sendMessage(str(tid), str(mobile), datas)

启动celery

代码语言:javascript
复制
celery -A celery_tasks.main worker -l info -P gevent
在这里插入图片描述
在这里插入图片描述

2.发送短信验证码

代码语言:javascript
复制
#发送短信验证码
class SmsCodeView(View):

    def get(self,request,mobile):
        # 1. 接收参数(手机号,图片验证码,uuid)
        image_code = request.GET.get('image_code')
        uuid=request.GET.get('image_code_id')
        # 2. 验证参数
        if not all([mobile,image_code,uuid]):
            # 响应码
            return http.JsonResponse({'code':RETCODE.NECESSARYPARAMERR,'errormsg':'参数不齐'})
        # 3. 验证用户输入的图片验证码和服务器保存的图片验证码一致
        try:
            redis_conn = get_redis_connection('code')
            redis_code = redis_conn.get('img_%s'%uuid)

            if redis_code is None:
                return http.JsonResponse({'code':RETCODE.IMAGECODEERR,'errmsg':'图片验证码过期'})

            # 添加一个删除图片验证码的逻辑
            redis_conn.delete('img_%s'%uuid)
        except Exception as e:
            logger.error(e)
            return http.JsonResponse({'code':RETCODE.DBERR,'errmsg':'redis有异常'})

        # 我们获取redis的数据都是bytes类型
        if redis_code.decode().lower() != image_code.lower():
            return http.JsonResponse({'code':RETCODE.SMSCODERR,'errmsg':'图片验证码错误'})


        # 判断标记位是否为1
        send_flag = redis_conn.get('send_flag_%s'%mobile)

        if send_flag:
            return http.JsonResponse({'code':RETCODE.THROTTLINGERR,'errmsg':'操作太频繁'})

        # 4. 先生成一个随机短信码
        from random import randint
        # 不满6位 补齐
        sms_code =  '%06d'%randint(0,999999)

        # 5. 先把短信验证码保存起来
        pipe = redis_conn.pipeline()
        pipe.setex('sms_%s' % mobile, SMS_CODE_EXPIRE_TIME, sms_code)
        pipe.setex('send_flag_%s' % mobile, 60, 1)

        #让管道执行
        pipe.execute()

        # 6. 最后发送
        # 我们的函数 需要通过delay调用 才能添加到 broker(队列)中
        from celery_tasks.sms.tasks import send_sms_code
        ## send_sms_code 的参数 平移到 delay中
        send_sms_code.delay(mobile,sms_code)
        #sdk = SmsSDK(accId, accToken, appId)
        #datas = (str(sms_code),'2')
        #resp = sdk.sendMessage(str(tid), str(mobile), datas)
        return http.JsonResponse({'code':RETCODE.OK,'errmsg':'ok'})
在这里插入图片描述
在这里插入图片描述

总结

celery的作用

  • 普通异步任务
  • 定时任务

对于(钩子函数,监控)等不在多做阐述

参考链接 celery用法:https://www.cnblogs.com/wdliu/p/9517535.html django中celery用法:https://www.cnblogs.com/wdliu/p/9530219.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/01/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、短信验证码
    • 1.celery消息中间件
      • 1.1celery的相关概念
      • 1.2celery的使用
    • 2.发送短信验证码
    • 总结
    相关产品与服务
    消息队列 CMQ 版
    消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档