實驗celery非同步傳送簡訊

2021-10-24 12:48:05 字數 2714 閱讀 3093

# 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將佇列中...