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

发布时间 - 2025-07-14 00:00:00    点击率:

文章目录

一、短信验证码

  1. Celery消息中间件

    1.1 Celery的相关概念

    1.2 Celery的使用

  2. 发送短信验证码

总结

一、短信验证码

  1. Celery消息中间件

    1.1 Celery的相关概念

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

工作原理:

任务模块(Task)包含异步任务和定时任务。异步任务通常在业务逻辑中被触发并发送到消息队列,而定时任务由Celery Beat进程周期性地将任务发送到消息队列;任务执行单元(Worker)实时监视消息队列并获取队列中的任务进行执行;Worker执行完任务后将结果保存在Backend中。消息中间件(Broker)官方提供了许多备选方案,支持RabbitMQ、Redis、Amazon SQS、MongoDB、Memcached等,官方推荐使用RabbitMQ。

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

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

1.2 Celery的使用

代码语言:javascript

pip install celery # 消息队列异步发送
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

  1. 发送短信验证码

代码语言: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


# python  # redis  # apache  # mongodb  # ai  # 图片验证码  # red  # 2025  # JavaScript  # django  # rabbitmq  # 分布式  # 中间件  # 并发  # 异步  # memcached  # elasticsearch  # 验证码  # 自己的  # 配置文件  # 发送短信  # 多个  # 就可以  # 的是  # 都是  # 这是  # 加载 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  JS经典正则表达式笔试题汇总  详解Android中Activity的四大启动模式实验简述  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  详解Android——蓝牙技术 带你实现终端间数据传输  如何做网站制作流程,*游戏网站怎么搭建?  如何在Windows服务器上快速搭建网站?  java获取注册ip实例  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  浅谈Javascript中的Label语句  微信小程序 scroll-view组件实现列表页实例代码  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  Thinkphp 中 distinct 的用法解析  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  如何在阿里云高效完成企业建站全流程?  Windows Hello人脸识别突然无法使用  Laravel如何配置和使用缓存?(Redis代码示例)  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  个人摄影网站制作流程,摄影爱好者都去什么网站?  🚀拖拽式CMS建站能否实现高效与个性化并存?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  大型企业网站制作流程,做网站需要注册公司吗?  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  Laravel如何处理文件下载请求?(Response示例)  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  java ZXing生成二维码及条码实例分享  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  怎么用AI帮你设计一套个性化的手机App图标?  如何在IIS中新建站点并解决端口绑定冲突?  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  清除minerd进程的简单方法  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  如何在宝塔面板创建新站点?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】