python---使用celery分布式系统异步发送短信(云通讯)来验证登录

news2024/12/23 21:04:04
  1. 环境
requests==2.32.3
Django==2.1.15
celery==5.4.0
redis==3.4.1
django-redis==4.11.0
djangorestframework==3.11.0
djangorestframework-jwt==1.11.0
eventlet==0.36.1

注:使用redis作为缓存,restframework框架,jwt token
2.celery异步配置

1.在项目的根目录新建文件夹 celery_tasks
2.在celery_tasks下新建config.py 配置文件
# config.py

# 编写celery配置信息
# 指定消息队列的位置
broker_url = 'redis://127.0.0.1:6379/15'
# 返回执行结果
result_backend = 'redis://127.0.0.1:6379/14'
3.在celery_tasks下新建main.py,celery启动文件
# main.py

from celery import Celery
import os
# 创建celery实例对象
celery_app = Celery('frame')

# 把celery和django组合,识别加载django 的配置
os.environ["DJANGO_SETTINGS_MODULE"] = "Frame.settings"

# 通过app对象加载配置
celery_app.config_from_object('celery_tasks.config')

# 加载任务
# 参数必须是一个列表
celery_app.autodiscover_tasks(['celery_tasks.sms', ])
4.在celery_tasks下新建sms/tasks.py文件,添加任务
# tasks.py

from celery_tasks.main import celery_app
from celery_tasks.sms.menwang.smsclient import SmsClient
import logging

logger = logging.getLogger("django")

@celery_app.task(name='send_sms_code')
def send_sms_code(mobile, sms_code):
    try:
        send_res = SmsClient().singleSend(mobile=mobile, code=sms_code, expiration_time=5) 
        # 调用云通讯接口发送短信,接受手机号,验证码,过期时间
    except Exception as e:
        raise Exception(e)
    return send_res

项目目录结构
在这里插入图片描述
3.梦网云通讯短信服务。免费赠送100条短信,直接在官网注册登录,个人测试可以不用资质认证

1.在文本短信---发送账号页下拉,点击“立刻获得测试账号”,系统即生成一个测试账号,在列表中展示。

url、用户名、密码、apikey获取
在这里插入图片描述
短信模板获取
在这里插入图片描述
准备工作完毕,接下来连接云通讯发送短信
4.在sms文件夹下新建menwang/smsclient.py发送单条短信

import time
import json
import traceback
import requests
from celery_tasks.sms.menwang import smsmessage
from celery_tasks.sms.menwang.smsexception import *


# 文本短信发送客户端
class SmsClient():
    def __init__(self):
        self._userid = 'RTFG56'  # 发送者帐号
        self._pwd = 'UYIJK89'  # 发送者帐号的密码
        self._url = 'http://api01.monyun.cn:7911/sms/v2/sdd/'  # 请前往您的控制台获取请求域名(IP)或联系梦网客服进行获取

    @property
    def userid(self):
        return self._userid

    @property
    def pwd(self):
        return self._pwd

    @property
    def url(self):
        return self._url

    # http post
    def postSmsMessage(self, message):
        fullurl = self.url + message.apiname
        try:
            r = None
            body = message.toJson()
            timeout = (5, 30)

            headers = {'Content-Type': 'application/json', 'Connection': 'Close'}
            # 短连接请求
            r = requests.post(fullurl, data=body, headers=headers, timeout=timeout)

            r.encoding = 'utf-8'
            debugStr = '\n[------------------------------------------------------------\n' + \
                       'http url:' + fullurl + '\n' + \
                       'headers:' + headers.__str__() + '\n' + \
                       body + '\n' + \
                       'status code:' + str(r.status_code) + '\n' + \
                       r.text + \
                       '\n-------------------------------------------------------------]\n'
            print(debugStr)

            # http请求失败
            if (r.status_code != requests.codes.ok):
                return message.makeupRet(SmsErrorCode.ERROR_310099)

            # 请求成功,解析服务器返回的json数据,
            rTest = json.loads(r.text)
            return rTest
        except SmsValueError as v:
            return message.makeupRet(v.errorcode)
        except requests.RequestException as e:
            print(traceback.format_exc().__str__())
            return message.makeupRet(SmsErrorCode.ERROR_310099)
        except Exception as e:
            print(traceback.format_exc().__str__())
            return message.makeupRet(SmsErrorCode.ERROR_310099)

    # 单条发送(短信)
    def singleSend(self, mobile, code, expiration_time):
        message = smsmessage.SmsSingleMessage()
        # 发送者帐号
        message.userid = self.userid
        # 密码
        message.pwd = self.pwd
        # 接收方手机号码
        message.mobile = mobile
        # 验证码数字<=6位
        message.content = u'您的验证码是{0},在{1}分钟内输入有效。如非本人操作请忽略此短信。'.format(code, expiration_time)
        # 业务类型:最大可支持10个长度的ASCII字符串:字母,数字
        message.svrtype = '0123456789'
        # 扩展号:长度不能超过6位,注意通道号+扩展号的总长度不能超过20位,若超出exno无效,如不需要扩展号则不用提交此字段或填空
        message.exno = '123456'
        # 用户自定义流水编号:该条短信在您业务系统内的ID,比如订单号或者短信发送记录的流水号。填写后发送状态返回值内将包含这个ID。
        # 最大可支持64位的ASCII字符串:字母、数字、下划线、减号,如不需要则不用提交此字段或填空
        message.custid = 'b3d0a2783d31b21b8573'
        # 业务类型:最大可支持10个长度的ASCII字符串:字母,数字
        message.exdata = '0123456789'

        ret = self.postSmsMessage(message=message)
        print('singleSend:', ret)
        return ret

别的接口可以到官网下载demo,里面有各种详细的示例
在这里插入图片描述
5.启动celery

# 在项目的根目录下
celery -A celery_tasks.main worker --loglevel=info
# 以守护进程方式启动
celery multi start work -A main -l info -B --logfile=celerylog.log

注:在Windows系统中发现任务启动了,redis中也有记录,但就是不发短信。原因:celery不支持在windows下运行任务,需要借助eventlet来完成
前面已经安装过了
celery -A celery_tasks.main worker -l info -P eventlet -c 10
6.最后创建appp,挂载、路由、这些就不说了,在视图views中调用celery任务异步发送短信

from django_redis import get_redis_connection
from rest_framework.views import APIView, Response
from random import randint
from celery_tasks.sms.tasks import send_sms_code

# Create your views here.

ret = {'code': 100, 'msg': None, 'data': None}
class SMSCode(APIView):
    authentication_classes = []   # 不进行token认证
    def post(self, request):
        global ret
        try:
            mobile = request.data['mobile']
            redis_conn = get_redis_connection('verify_codes')
            send_flag = redis_conn.get('send_flag_%s' % mobile)
            if send_flag:
                ret['code'] = 101
                ret['msg'] = '请勿频繁发送短信'
                return Response(ret)
            sms_code = '%06d' % randint(0, 999999)
            result = send_sms_code.delay(mobile=str(mobile), sms_code=sms_code)
            print(result)  # 任务处理结果task_id
            # SmsClient().singleSend(str(mobile), sms_code, SMS_CODE_REDIS_EXPIRES // 60)
            pl = redis_conn.pipeline()
            pl.setex('sms_code_%s' % mobile, 300, sms_code)
            pl.setex('send_flag_%s' % mobile, 60, 1)
            pl.execute()
            ret['msg'] = '短信发送成功'
        except Exception as e:
            ret['code'] = 102
            ret['msg'] = e

        return Response(ret)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1936848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在LabVIEW中实现图像矫正

在LabVIEW中实现图像矫正&#xff0c;特别是将倾斜的笔记本图像&#xff08;如左图&#xff09;校正为正视图像&#xff08;如右图&#xff09;&#xff0c;通常需要以下几个步骤&#xff1a; 1. 获取图像 使用图像采集设备或加载图像文件来获取图像数据。 2. 图像预处理 对…

2024-07-19 Unity插件 Odin Inspector10 —— Misc Attributes

文章目录 1 说明2 其他特性2.1 CustomContextMenu2.2 DisableContextMenu2.3 DrawWithUnity2.4 HideDuplicateReferenceBox2.5 Indent2.6 InfoBox2.7 InlineProperty2.8 LabelText2.9 LabelWidth2.10 OnCollectionChanged2.11 OnInspectorDispose2.12 OnInspectorGUI2.13 OnIns…

TeamViewer手机端APP提示:请先验证账户

当你在手机端下载安装了TeamViewerAPP后&#xff0c;需要你先登录个人账号&#xff0c;然后还会要求你验证账户&#xff0c;同时跳转到一个网址中&#xff0c;但是这个网址并没有自动跳转到验证账户的位置。 解决办法&#xff1a; 在手机浏览器中进入下面这个网址&#xff1a;…

时序数据库如何选型?详细指标总结!

工业物联网场景&#xff0c;如何判断什么才是好的时序数据库&#xff1f; 工业物联网将机器设备、控制系统与信息系统、业务过程连接起来&#xff0c;利用海量数据进行分析决策&#xff0c;是智能制造的基础设施&#xff0c;并影响整个工业价值链。工业物联网机器设备感知形成了…

ubuntu 24 PXE Server (bios+uefi) 批量部署系统

pxe server 前言 PXE&#xff08;Preboot eXecution Environment&#xff0c;预启动执行环境&#xff09;是一种网络启动协议&#xff0c;允许计算机通过网络启动而不是使用本地硬盘。PXE服务器是实现这一功能的服务器&#xff0c;它提供了启动镜像和引导加载程序&#xff0c;…

以Zookeeper为例 浅谈脑裂与奇数节点问题

一、脑裂现象的定义与影响 脑裂&#xff08;split-brain&#xff09;是指在分布式系统中&#xff0c;因网络分区或其他故障导致系统被切割成两个或多个相互独立的子系统&#xff0c;每个子系统可能独立选举出自己的领导节点。这一现象在依赖中心领导节点&#xff08;如Elastic…

MVC架构在Web开发中的实现

MVC架构在Web开发中的实现 1、MVC架构概述2、MVC架构的实现 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Web开发领域&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;架构模式是一种广泛使用的软件设计模式&#xff0c…

数据可视化配色新工具,颜色盘多达2500+类

好看的配色,不仅能让图表突出主要信息,更能吸引读者,之前分享过很多配色工具,例如, 👉可视化配色工具:颜色盘多达3000+类,数万种颜色! 本次再分享一个配色工具pypalettes,颜色盘多达2500+类。 安装pypalettes pip install pypalettes pypalettes使用 第1步,挑选…

在VS Code上搭建Vue项目教程(Vue-cli 脚手架)

1.前期环境准备 搭建Vue项目使用的是Vue-cli 脚手架。前期环境需要准备Node.js环境&#xff0c;就像Java开发要依赖JDK环境一样。 1.1 Node.js环境配置 1&#xff09;具体安装步骤操作即可&#xff1a; npm 安装教程_如何安装npm-CSDN博客文章浏览阅读836次。本文主要在Win…

哪种SSL证书可以快速签发保护http安全访问?

用户访问网站&#xff0c;经常会遇到访问http网页时&#xff0c;提示网站不安全或者不是私密连接的提示&#xff0c;因为http是使用明文传输&#xff0c;数据传输中可能被篡改&#xff0c;数据不被保护&#xff0c;通常需要SSL证书来给数据加密。 SSL证书的签发速度&#xff0…

Selenium之execute_script()方法执行js脚本

目录 场景应用和使用 页面滚动 获取返回值 返回JavaScript定位的元素对象 修改元素属性 弹出提示框 场景应用和使用 在自动化测试中&#xff0c;部分场景无法使用自动化Selenium原生方法来进行测试&#xff1a; 滚动到某个元素&#xff08;位置&#xff09; 修改…

数据分析入门指南:数据库入门(五)

本文将总结CDA认证考试中数据库中部分知识点&#xff0c;内容来源于《CDA模拟题库与备考资料PPT》 。 CDA认证&#xff0c;作为源自中国、面向全球的专业技能认证&#xff0c;覆盖金融、电信、零售、制造、能源、医疗医药、旅游、咨询等多个行业&#xff0c;旨在培养能够胜任数…

STM32 TIM定时器从模式控制器

TIM 从模式控制器 从模式控制器控制框图 从机模式 /** defgroup TIM_Slave_Mode TIM Slave mode* {*/ #define TIM_SLAVEMODE_DISABLE 0x00000000U /*!< Slave mode disabled */ #define TIM_SLAVEMOD…

IDEA创建Java工程、Maven安装与建立工程、Web工程、Tomcat配置

《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试&#xff08;Debug&#xff09; 第七章 …

[C++]优先级队列

1 .了解优先级队列 优先级队列是一种容器适配器&#xff0c;根据一些严格的弱排序标准&#xff0c;专门设计使其第一个元素始终是它所包含的元素中最大的元素。 此上下文类似于堆&#xff0c;其中可以随时插入元素&#xff0c;并且只能检索最大堆元素&#xff08;优先级队列中顶…

idea2019版本创建JavaWeb项目并配置Tomcat步骤

一、创建JavaWeb项目 1.新建项目File->New->Project 2. 选择JavaWeb应用在New Project窗口中选择Java后勾选Java EE中的Web Application后点击next即可 3.设置项目名称后点击finish即可 4.至此项目创建完成&#xff0c;检查文件是否齐全&#xff0c;开始配置Tomcat 二、…

【iOS】——消息传递底层实现

消息传递是什么 Objective-C是一种动态类型语言&#xff0c;这意味着在编译时并不确定对象的具体类型&#xff0c;而是在运行时决定。消息传递机制允许程序在运行时向对象发送消息&#xff0c;对象再决定如何响应这些消息。 当你通过对象调用方法时&#xff0c;例如像这样[ob…

React 从入门到实战 一一开发环境基础搭建(小白篇)

React 从入门到实战一一开发环境基础搭建&#xff08;小白篇&#xff09; React 介绍什么是 react &#xff1f;react 主要功能react 框架特点 开发工具渲染测试 React 介绍 最近两年&#xff0c;react 也愈来愈火热&#xff0c;想要在里面分一杯羹&#xff0c;那肯定逃不过 r…

CentOS 7开启SSH连接

1. 安装openssh-server 1.1 检查是否安装openssh-server服务 yum list installed | grep openssh-server如果有显示内容&#xff0c;则已安装跳过安装步骤&#xff0c;否则进行第2步 1.2 安装openssh-server yum install openssh-server2. 开启SSH 22监听端口 2.1 打开ssh…

阿里云盾占用资源的问题AliYunDun,AliYunDunUpdate

目录 1.关闭AliYunDunUpdate&#xff0c;AliYunDun&#xff0c;AliYunDunMonitor。 2.发现报错如下 3.打开阿里云安全中心控制台 4.成功解决 2.开启云盾命令 “如果您在解决类似问题时也遇到了困难&#xff0c;希望我的经验分享对您有所帮助。如果您有任何疑问或者想分享您…