# celery專案中的所有導包位址, 都是以celery_base_dir為基準設定.
# 執行celery命令時, 也需要進入celery_base_dir目錄執行.
celery_base_dir = os.path.dirname(os.path.abspath(__file__)
)true
)def
send_sms_code
(self, mobile, datas)
: sys.path.insert(
0, os.path.join(celery_base_dir,
'../syl'))
# 在方法中導包
from libs.rl_sms import send_message
# time.sleep(5)
try:
# 用 res 接收傳送結果, 成功是:0, 失敗是:-1
res = send_message(mobile, datas)
except exception as e:
res =
'-1'
if res ==
'-1'
:# 如果傳送結果是 -1 就重試.
self.retry(countdown=
5, max_retries=
3, exc=exception(
'簡訊傳送失敗'
))
class
smscodeview
(apiview)
:"""使用apiview的限流"""
# 1. 所有人可以訪問
permission_classes =
(allowany,
)def
post
(self, request)
:# 1. 獲取引數
phone = request.data.get(
'phone'
)# 手機號
image_code = request.data.get(
'image_code'
)# 驗證碼
image_code_uuid = request.data.get(
'image_code_uuid'
)# 前端生成的uuid
# 2. 檢查引數
ifnot
all(
[phone, image_code, image_code_uuid]):
return response()if
not re.match(r'^1[3456789]\d$'
, phone)
:return response(
)# 3. 檢查是否傳送
redis_client = get_redis_connection(
'img_code'
) phone_exists = redis_client.get(phone)
if phone_exists:
return response(
)# 驗證圖形驗證碼
redis_image_code = redis_client.get(image_code_uuid)
# bytes
if redis_image_code:
# bytes 轉成 string
redis_image_code = redis_image_code.decode(
)# 比較使用者提供的內容是否和redis中儲存的一致
if image_code.upper(
)!= redis_image_code:
return response(
)# 4. 傳送
code =
'%06d'
% random.randint(0,
999999
)# 隨機6位驗證碼
from syl.settings import base_dir
sys.path.insert(
0, os.path.join(base_dir,
'../celery_task'))
from main import send_sms_code # 必須這麼寫, 從main中導包
send_sms_code.delay(phone,
(code,
"5")
)print
(code)
# 5.使用 pipeline 批量操作
pl = redis_client.pipeline(
)# 例項化pipeline物件
pl.setex(phone,60*
5, code)
# 儲存phone:code, 5分鐘有效期
pl.delete(image_code_uuid)
# 從redis中刪除這個驗證碼, 以防再次被使用
pl.execute(
)# 6. 返回結果
return response(
)
urlpatterns =
[ path(
'sms_codes/'
, views.smscodeview.as_view())
,]
celery非同步傳送簡訊
celery專案中的所有導包位址,都是以celery base dir為基準設定 執行celery命令時,也需要進入celery base dir目錄執行 celery base dir os.path.dirname os.path.abspath file def send sms code s...
使用celery非同步傳送簡訊
1.1 在 celery task mian.py 中新增傳送簡訊函式 celery專案中的所有導包位址,都是以celery base dir為基準設定.執行celery命令時,也需要進入celery base dir目錄執行.celery base dir os.path.dirname os.p...
使用celery非同步處理傳送簡訊功能
celery介紹 終端直接安裝 pip install u celery 任務佇列是一種跨執行緒 跨機器工作的一種機制,celery通過訊息進行通訊,通常使用乙個叫broker 中間人 來協client 任務的發出者 和worker 任務的處理者 clients發出訊息到佇列中,broker將佇列中...