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.pswp.cn/news/452607.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452607.shtml
英文地址,請注明出處:http://en.pswp.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…