# 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傳送簡訊介面
2.測試介面 celery專案中的所有導包位址,都是以celery base dir為基準設定.執行celery命令時,也需要進入celery base dir目錄執行.celery base dir os.path.dirname os.path.abspath file true def sen...
celery非同步傳送簡訊
celery專案中的所有導包位址,都是以celery base dir為基準設定 執行celery命令時,也需要進入celery base dir目錄執行 celery base dir os.path.dirname os.path.abspath file def send sms code s...