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

2021-09-11 06:20:16 字數 1956 閱讀 6362

celery介紹:

終端直接安裝: pip install -u celery

任務佇列是一種跨執行緒、跨機器工作的一種機制,celery通過訊息進行通訊,通常使用乙個叫broker(中間人)來協client(任務的發出者)和worker(任務的處理者). clients發出訊息到佇列中,broker將佇列中的資訊派發給worker來處理。乙個celery系統可以包含很多的worker和broker,可增強橫向擴充套件性和高可用性能。

非同步處理簡訊:

先建立celery_tasks子應用用於儲存celery非同步任務。

在celery_tasks目錄下建立config.py檔案,用於儲存celery的配置資訊

broker_url = "redis:"
在celery_tasks目錄下建立main.py檔案,用於作為celery的啟動檔案

from celery import celery

# 為celery使用django配置檔案進行設定

import os

if not os.getenv('django_settings_module'):

os.environ['django_settings_module'] = 'meiduo_mall.settings.dev'

# 建立celery應用

# 匯入celery配置

# 自動註冊celery任務

在celery_tasks/sms/目錄下建立tasks.py檔案,用於儲存傳送簡訊的非同步任務

import logging

from .yuntongxun.sms import ccp

logger = logging.getlogger("django")

# 驗證碼簡訊模板

sms_code_temp_id = 1

def send_sms_code(mobile, code, expires):

"""傳送簡訊驗證碼

:param mobile: 手機號

:param code: 驗證碼

:param expires: 有效期

:return: none

"""try:

ccp = ccp()

result = ccp.send_template_sms(mobile, [code, expires], sms_code_temp_id)

except exception as e:

logger.error("傳送驗證碼簡訊[異常][ mobile: %s, message: %s ]" % (mobile, e))

else:

if result == 0:

logger.info("傳送驗證碼簡訊[正常][ mobile: %s ]" % mobile)

else:

logger.warning("傳送驗證碼簡訊[失敗][ mobile: %s ]" % mobile)

在verifications/views.py中改寫smscodeview檢視,使用celery非同步任務傳送簡訊

from celery_tasks.sms import tasks as sms_tasks

class smscodeview(genericapiview):

...# 傳送簡訊驗證碼

sms_code_expires = str(constants.sms_code_redis_expires // 60)

sms_tasks.send_sms_code.delay(mobile, sms_code, sms_code_expires)

return response()

使用celery非同步傳送簡訊

1.1 在 celery task mian.py 中新增傳送簡訊函式 celery專案中的所有導包位址,都是以celery base dir為基準設定.執行celery命令時,也需要進入celery base dir目錄執行.celery base dir os.path.dirname os.p...

非同步傳送郵件 celery

包結構 依賴包 redis3.4.1 celery4.4.1 eventlet 0.25.1 首先建立乙個celery tasks的python包,在celery tasks的 init py中配置 drugstore是你專案的主目錄名稱,即有settings.py檔案的包名 這個需要改為你自己的 ...

celery非同步傳送簡訊

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