使用celery非同步傳送簡訊

2021-10-10 06:12:06 字數 2944 閱讀 4290

1.1 在 celery_task/mian.py 中新增傳送簡訊函式

# 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 utils.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(

'簡訊傳送失敗'

))

1.2 在 verifications/views.py 中新增celery傳送簡訊試圖函式
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(

)# 4.檢查驗證圖形驗證碼

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(

)# 5. 傳送

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)

# 6.使用 pipeline 批量操作

pl = redis_client.pipeline(

)# 例項化pipeline物件

pl.setex(phone,60*

5, code)

# 儲存phone:code, 5分鐘有效期

pl.delete(image_code_uuid)

# 從redis中刪除這個驗證碼, 以防再次被使用

pl.execute(

)# 7. 返回結果

return response(

)

1.3 新增路由
urlpatterns =

[ path(

'sms_codes/'

, views.smscodeview.as_view())

,]

2. 測試介面

1>. 介面url

/user/sms_codes/2>. 請求攜帶引數

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非同步傳送簡訊

celery專案中的所有導包位址,都是以celery base dir為基準設定.執行celery命令時,也需要進入celery base dir目錄執行.celery base dir os.path.dirname os.path.abspath file true def send sms c...

使用celery非同步處理傳送簡訊功能

celery介紹 終端直接安裝 pip install u celery 任務佇列是一種跨執行緒 跨機器工作的一種機制,celery通過訊息進行通訊,通常使用乙個叫broker 中間人 來協client 任務的發出者 和worker 任務的處理者 clients發出訊息到佇列中,broker將佇列中...