Flask爱家租房--celery(发送验证短信)

0.配置文件

# coding:utf-8BROKER_URL = "redis://127.0.0.1:6379/1"
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/2'

1.启动文件

# coding:utf-8from celery import Celery
from ihome.tasks import config# 定义celery对象
celery_app = Celery("ihome")# 引入配置信息
celery_app.config_from_object(config)# 自动搜寻异步任务
celery_app.autodiscover_tasks(["ihome.tasks.sms"])

2.发送短信辅助类

# coding=utf-8from CCPRestSDK import REST# 主帐号
accountSid = '8aaf0708568d4143015697b0f4960888'# 主帐号Token
accountToken = '42d3191f0e6745d6a9ddc6c795da0bed'# 应用Id
appId = '8aaf0708568d4143015697b0f56e088f'# 请求地址,格式如下,不需要写http://
serverIP = 'app.cloopen.com'# 请求端口
serverPort = '8883'# REST版本号
softVersion = '2013-12-26'# 发送模板短信# @param to 手机号码# @param datas 内容数据 格式为列表 例如:['12','34'],如不需替换请填 ''# @param $tempId 模板Idclass CCP(object):"""自己封装的发送短信的辅助类"""# 用来保存对象的类属性instance = Nonedef __new__(cls):# 判断CCP类有没有已经创建好的对象,如果没有,创建一个对象,并且保存# 如果有,则将保存的对象直接返回if cls.instance is None:obj = super(CCP, cls).__new__(cls)# 初始化REST SDKobj.rest = REST(serverIP, serverPort, softVersion)obj.rest.setAccount(accountSid, accountToken)obj.rest.setAppId(appId)cls.instance = objreturn cls.instancedef send_template_sms(self, to, datas, temp_id):""""""result = self.rest.sendTemplateSMS(to, datas, temp_id)# for k, v in result.iteritems():##     if k == 'templateSMS':#         for k, s in v.iteritems():#             print '%s:%s' % (k, s)#     else:#         print '%s:%s' % (k, v)# smsMessageSid:ff75e0f84f05445ba08efdd0787ad7d0# dateCreated:20171125124726# statusCode:000000status_code = result.get("statusCode")if status_code == "000000":# 表示发送短信成功return 0else:# 发送失败return -1

3.发送短信后端逻辑

# GET /api/v1.0/sms_codes/<mobile>?image_code=xxxx&image_code_id=xxxx
@api.route("/sms_codes/<re(r'1[34578]\d{9}'):mobile>")
def get_sms_code(mobile):"""获取短信验证码"""# 获取参数image_code = request.args.get("image_code")image_code_id = request.args.get("image_code_id")# 校验参数if not all([image_code_id, image_code]):# 表示参数不完整return jsonify(errno=RET.PARAMERR, errmsg="参数不完整")# 业务逻辑处理# 从redis中取出真实的图片验证码try:real_image_code = redis_store.get("image_code_%s" % image_code_id)except Exception as e:current_app.logger.error(e)return jsonify(errno=RET.DBERR, errmsg="redis数据库异常")# 判断图片验证码是否过期if real_image_code is None:# 表示图片验证码没有或者过期return jsonify(errno=RET.NODATA, errmsg="图片验证码失效")# 删除redis中的图片验证码,防止用户使用同一个图片验证码验证多次try:redis_store.delete("image_code_%s" % image_code_id)except Exception as e:current_app.logger.error(e)# 与用户填写的值进行对比if real_image_code.lower() != image_code.lower():# 表示用户填写错误return jsonify(errno=RET.DATAERR, errmsg="图片验证码错误")# 判断对于这个手机号的操作,在60秒内有没有之前的记录,如果有,则认为用户操作频繁,不接受处理try:send_flag = redis_store.get("send_sms_code_%s" % mobile)except Exception as e:current_app.logger.error(e)else:if send_flag is not None:# 表示在60秒内之前有过发送的记录return jsonify(errno=RET.REQERR, errmsg="请求过于频繁,请60秒后重试")# 判断手机号是否存在try:user = User.query.filter_by(mobile=mobile).first()except Exception as e:current_app.logger.error(e)else:if user is not None:# 表示手机号已存在return jsonify(errno=RET.DATAEXIST, errmsg="手机号已存在")# 如果手机号不存在,则生成短信验证码sms_code = "%06d" % random.randint(0, 999999)# 保存真实的短信验证码try:redis_store.setex("sms_code_%s" % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)# 保存发送给这个手机号的记录,防止用户在60s内再次出发发送短信的操作redis_store.setex("send_sms_code_%s" % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)except Exception as e:current_app.logger.error(e)return jsonify(errno=RET.DBERR, errmsg="保存短信验证码异常")# 发送短信# 使用celery异步发送短信, delay函数调用后立即返回(非阻塞)#send_sms.delay(mobile, [sms_code, int(constants.SMS_CODE_REDIS_EXPIRES/60)], 1)# 返回异步任务的对象result_obj = send_sms.delay(mobile, [sms_code, int(constants.SMS_CODE_REDIS_EXPIRES/60)], 1)print(result_obj.id)# 通过异步任务对象的get方法获取异步任务的结果, 默认get方法是阻塞的ret = result_obj.get()print("ret=%s" % ret)# 返回值# 发送成功return jsonify(errno=RET.OK, errmsg="发送成功")

4.client相关代码

# coding:utf-8from celery import Celery
from ihome.libs.yuntongxun.sms import CCP# 定义celery对象
celery_app = Celery("ihome", broker="redis://127.0.0.1:6379/1")@celery_app.task
def send_sms(to, datas, temp_id):"""发送短信的异步任务"""ccp = CCP()ccp.send_template_sms(to, datas, temp_id)# celery开启的命令
# celery -A ihome.tasks.task_sms worker -l info

5.worker相关代码

# coding:utf-8from ihome.tasks.main import celery_app
from ihome.libs.yuntongxun.sms import CCP#
# @celery_app.task
# def send_sms(to, datas, temp_id):
#     """发送短信的异步任务"""
#     pass@celery_app.task
def send_sms(to, datas, temp_id):"""发送短信的异步任务"""ccp = CCP()try:result = ccp.send_template_sms(to, datas, temp_id)except Exception as e:result = -2return result

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

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

相关文章

理论与实践:不要过度思考

你每天都在仔细翻阅Hacker News&#xff0c;惊奇于那些经过整理的创业传奇、功效无比的最佳实践理论、天才的技术解决方案&#xff0c;以及各种链接指向的大量的一站式的&#xff0c;极简主义的&#xff0c;色彩柔和的网站。你参加过精益(Lean)创业研讨会&#xff0c;读过了《F…

linux我如何查看一个脚本的路径,linux获取shell脚本所在绝对路径操作介绍

脚本名&#xff1a;a.sh位置&#xff1a;/tmp/whuang/study/java脚本内容&#xff1a;复制代码代码如下:#!/bin/shthis_dirpwddirname $0|grep "^/" >/dev/nullif [ $? -eq 0 ];thenthis_dirdirname $0elsedirname $0|grep "^/." >/dev/nullretval$…

Go编程技巧--io.Reader/Writer

Go原生的pkg中有一些核心的interface&#xff0c;其中io.Reader/Writer是比较常用的接口。很多原生的结构都围绕这个系列的接口展开&#xff0c;在实际的开发过程中&#xff0c;你会发现通过这个接口可以在多种不同的io类型之间进行过渡和转化。本文结合实际场景来总结一番。 总…

把base64转为blob

let blob1 dataURItoBlob(this.img); 转载于:https://www.cnblogs.com/miaSlady/p/9073550.html

Flask爱家租房--房屋管理(获取房东发布的房源信息条目)

文章目录0.效果展示1.重点总结2.后端代码3.前端html4.前端js0.效果展示 1.重点总结 1&#xff09;用户点击“我的房源”&#xff0c;页面开始加载&#xff0c;此时myhouse.js限定只有完成实名认证的房东才可以查询已有的房源信息&#xff0c;因此myhouse.js首先调用用户认证的…

TCP如何利用不可靠的IP协议实现可靠传输

IP协议之所以是不可靠的是因为IP网络存在冲突丢包及传输错误甚至被恶意篡改的情况&#xff1b;虽然IP协议是不可靠的&#xff0c;但其服务的上层协议为了规避这些不可靠的因素&#xff0c;有些协议就会自己设计机制从而保证自己传输的内容可靠&#xff1b;TCP就是其中之一&…

jsp通过include指令引入html乱码的解决方法

本文转自&#xff1a;https://blog.csdn.net/gnail_oug/article/details/51707061 在jsp中使用<%include file"in.html" %>导入html页面时&#xff0c;如果html页面里有中文&#xff0c;就会产生乱码。检查jsp文件和html文件的编码&#xff0c;编码一致&#x…

linux怎么删干净mysql,linux怎么干净卸载mysql

1、查找以前是否装有mysql命令&#xff1a;rpm -qa|grep -i mysql可以看到如下图的所示&#xff1a;说明之前安装了&#xff1a;MySQL-client-5.5.25a-1.rhel5MySQL-server-5.5.25a-1.rhel52、停止mysql服务、删除之前安装的mysql删除命令&#xff1a;rpm -e –nodeps 包名# rp…

各大互联网公司java开发面试常问问题

本人是做java开发的&#xff0c;这是我参加58&#xff0c;搜狐&#xff0c;搜狗&#xff0c;新浪微博&#xff0c;百度&#xff0c;腾讯文学&#xff0c;网易以及其他一些小的创业型公司的面试常被问的问题&#xff0c;当然有重复&#xff0c;弄清楚这些&#xff0c;相信面试会…

14种方法助你参与开源项目

导读&#xff1a;每日[快讯精选]是由CSDN研发频道推出的特色栏目&#xff0c;每一天我们将从国外技术媒体(例如Hacker News、Reddit...等等)中挑选出有价值的新闻简讯&#xff0c;让您在第一时间掌握业界主流的技术文摘&#xff0c;每天清晨为您献上第一份技术早餐。 [1]Javac…

Flask爱家租房--房屋管理(获取主页幻灯片展示的房屋基本信息)

文章目录0.效果展示1.重点总结2.后端代码3.前端js4.前端html0.效果展示 1.重点总结 1&#xff09;当用户访问首页时&#xff0c;开始加载页面信息&#xff0c;此时index.js文件首先调用后端接口check_login()&#xff0c;判断用户是否登录&#xff0c;未登录则在右上角关联注册…

C#题目及答案(1)

1. 简述 private、 protected、 public、 internal 修饰符的访问权限。 答 . private : 私有成员, 在类的内部才可以访问。 protected : 保护成员,该类内部和继承类中可以访问。 public : 公共成员,完全公开,没有访问限制。 internal: 在同一命名空间内可以访问。 2 .列举ASP.N…

linux bash函数里面调用命令行,Linux-在gnome-terminal -x中运行bash函数

您可以将其与export -f一起使用,就像kojiro的上面的注释中指出的那样.# Define function.my_func() {// Do cool stuff}# Export it, so that all child bash processes see it.export -f my_func# Invoke gnome-terminal with bash -c and the function name, *plus*# another…

随想录(软件开发不能是加工作坊)

前一段时间看了一本《走出软件作坊》&#xff0c;心情很沉重。不管你是否承认&#xff0c;书中描述的情况在现在的国内IT企业中确实存在&#xff0c;可能涉及的范围还很广。联想到自己目前处于的行业&#xff0c;心中不免唏嘘不已。类似的事件&#xff0c;类似的方法&#xff0…

程序员的核心竞争力

1、稳定的基础知识体系&#xff1b; 2、需求到模型的转化建模能力&#xff1b; 3、独立思考能力&#xff1b; 4、思想&#xff1a;世界观、方法论。

Flask爱家租房--订单支付(支付过程)

文章目录0.支付流程1. 重点总结2.后端代码3.前端js4.前端html0.支付流程 1. 重点总结 1&#xff09;用户进入“我的订单”页面&#xff0c;点击“去支付”&#xff1b; 触发后端js中的函数&#xff0c;发出ajsx异步请求&#xff0c;调用后端相应接口order_pay(order_id)&#…

微信小程序利用key实现列表性能的提升

微信小程序利用key实现列表性能的提升 key值在列表渲染的时候&#xff0c;能够提升列表渲染性能&#xff0c;为什么呢&#xff1f;首先得想想小程序的页面是如何渲染的&#xff0c;主要分为以下几步&#xff1a; 将wxml结构的文档构建成一个vdom虚拟数页面有新的交互&#xff0…