首页 > 运维 > linux运维 > 正文

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

看不見的法師
发布: 2025-07-14 09:24:24
原创
982人浏览过

文章目录

一、短信验证码

  1. Celery消息中间件

    1.1 Celery的相关概念

    1.2 Celery的使用

  2. 发送短信验证码

总结

一、短信验证码

  1. Celery消息中间件

    1.1 Celery的相关概念

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

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

工作原理:

任务模块(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")
<h1>② 创建celery实例对象</h1><p>from celery import Celery</p>
                    <div class="aritcle_card">
                        <a class="aritcle_card_img" href="/ai/2447">
                            <img src="https://img.php.cn/upload/ai_manual/001/246/273/176620077732160.png" alt="知识画家">
                        </a>
                        <div class="aritcle_card_info">
                            <a href="/ai/2447">知识画家</a>
                            <p>AI交互知识生成引擎,一句话生成知识视频、动画和应用</p>
                            <div class="">
                                <img src="/static/images/card_xiazai.png" alt="知识画家">
                                <span>8</span>
                            </div>
                        </div>
                        <a href="/ai/2447" class="aritcle_card_btn">
                            <span>查看详情</span>
                            <img src="/static/images/cardxiayige-3.png" alt="知识画家">
                        </a>
                    </div>
                <h1>celery的第一个参数是main</h1><h1>习惯上,填写当前脚本的工程名就可以</h1><h1>给celery的实例起个名字,这个名字唯一就可以</h1><p>app = Celery('celery_tasks')</p><h1>③ celery 设置 broker (队列)</h1><h1>config_from_object 参数: 就是 配置文件的路径</h1><p>app.config_from_object('celery_tasks.config')</p><h1>④ 让celery自动检测任务</h1><h1>autodiscover_tasks 参数是 列表</h1><h1>列表的元素是: 任务的包路径</h1><p>app.autodiscover_tasks(['celery_tasks.sms'])
登录后复制

配置文件

代码语言:javascript

##!/usr/bin/env python3</p><h2>-<em>- coding:utf-8 -</em>-</h2><h2>Author:wd</h2><h1>from project import app</h1><h1>from celery.schedules import crontab</h1><h1>BROKER_URL = 'redis://10.1.210.69:6379/0' # Broker配置,使用Redis作为消息中间件</h1><h1>CELERY_RESULT_BACKEND = 'redis://10.1.210.69:6379/0' # BACKEND配置,这里使用redis</h1><h1>CELERY_RESULT_SERIALIZER = 'json' # 结果序列化方案</h1><h1>CELERY_TASK_RESULT_EXPIRES = 60 <em> 60 </em> 24 # 任务过期时间</h1><h1>CELERY_TIMEZONE='Asia/Shanghai'   # 时区配置</h1><h1>CELERY_IMPORTS = (     # 指定导入的任务模块,可以指定多个</h1><h1>'project.tasks',</h1><h1>'project.period_task',</h1><h1>)</h1><h1>app.conf.beat_schedule = {</h1><h1>'period_add_task': {    # 计划任务</h1><h1>'task': 'project.period_task.add',  #任务路径</h1><h1>'schedule': crontab(hour=18, minute=16, day_of_week=1),</h1><h1>'args': (3, 4),</h1><h1>},</h1><h1>'add-every-30-seconds': {          # 每10秒执行</h1><h1>'task': 'project.period_task.sayhi',  #任务路径</h1><h1>'schedule': 10.0,</h1><h1>'args': ('wd',),</h1><h1>},</h1><h1>}</h1><h1>我们选择的是redis作为我们的 队列</h1><h1>选择redis的 14号库</h1><p>broker_url = "amqp://guest@localhost//"</p><h1>broker_url = "redis://127.0.0.1/14"</h1><h1>结果选择15号库</h1><p>result_backend = "redis://127.0.0.1/15"
登录后复制

任务模块

代码语言:javascript

"""① 任务的本质就是函数
② 这个函数必须要被celery的实例对象的 task装饰器装饰
③ 必须调用celery实例对象的自动检测来检测任务
"""
from celery_tasks.main import app</p><p>tid = 1 #默认模板
accId = ''#填写自己的
accToken = ''#填写自己的
appId = ''#填写自己的</p><p>from ronglian_sms_sdk import SmsSDK</p><p>@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
登录后复制

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

  1. 发送短信验证码

代码语言:javascript

# 发送短信验证码
class SmsCodeView(View):
def get(self,request,mobile):</p><h1>1. 接收参数(手机号,图片验证码,uuid)</h1><pre class="brush:php;toolbar:false;"><code>    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'})</code>
登录后复制

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

总结

Celery的作用在于处理普通异步任务和定时任务。对于钩子函数、监控等功能不再详述。

参考链接

Celery用法:https://www.cnblogs.com/wdliu/p/9517535.html

Django中Celery用法:https://www.cnblogs.com/wdliu/p/9530219.html

以上就是【愚公系列】2022年01月 Django商城项目08-注册界面-短信验证码的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号