溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

django使用celery異步發(fā)送短信

發(fā)布時(shí)間:2020-04-02 17:24:20 來源:網(wǎng)絡(luò) 閱讀:349 作者:劉小潭 欄目:編程語(yǔ)言
1. 安裝celery模塊
pip install -U celery==4.3.0
2. 創(chuàng)建celery相關(guān)目錄
xiaolan/  # 項(xiàng)目主目錄
├── mycelery/
    ├── config.py     # 配置文件
    ├── __init__.py   
    ├── main.py       # 主程序
    └── sms/          # 一個(gè)目錄可以放置多個(gè)任務(wù),該目錄下存放當(dāng)前任務(wù)執(zhí)行時(shí)需要的模塊或依賴
        └── tasks.py  # 任務(wù)的文件,名稱必須是這個(gè)
3. 創(chuàng)建celery配置文件config.py
# 注意: 我的redis因?yàn)闆]有設(shè)置密碼所有可以這樣用
# 任務(wù)隊(duì)列的鏈接地址
broker_url = 'redis://127.0.0.1:6379/15'
# 結(jié)果隊(duì)列的鏈接地址
result_backend = 'redis://127.0.0.1:6379/14'
4. 在man.py主程序中對(duì)django的配置文件進(jìn)行加載, 把django和celery進(jìn)行組合
import os
import django
from celery import Celery

# 主程序
# 創(chuàng)建celery實(shí)例對(duì)象
app = Celery("xiaolan")

# 把celery和django進(jìn)行結(jié)合, 識(shí)別和加載django的配置文件
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'xiaolan.settings.dev')

# 對(duì)django框架進(jìn)行初始化
django.setup()

# 通過app對(duì)象加載配置
app.config_from_object("mycelery.config")

# 加載任務(wù)
# 參數(shù)必須是一個(gè)列表, 里面的每一個(gè)都是任務(wù)的路徑名稱
# 列: app.autodiscover_tasks(["任務(wù)1", "任務(wù)2"])
app.autodiscover_tasks(["mycelery.sms"])

# 啟動(dòng)Celery的命令
# 強(qiáng)烈建議切換目錄到mycelery目錄下啟動(dòng)
# celery -A main worker --loglevel=info
5. 配置tasks.py, 把注冊(cè)短信發(fā)送功能, 整合成一個(gè)任務(wù)函數(shù),代碼:
from mycelery.main import app
from .yuntongxun.sms import CCP
from xiaolan.settings import constants
import logging
from django.conf import settings
log = logging.getLogger("django")

@app.task(name="send_sms")
def send_sms(mobile, sms_code):
    """異步發(fā)送短信"""
    ccp = CCP()
    try:
        result = ccp.send_template_sms(mobile, [sms_code, constants.SMS_CODE_EXPIRE//60 ], settings.SMS.get("_templateID"))
        return result
    except:
        log.error("發(fā)送短信驗(yàn)證碼失??!手機(jī)號(hào):%s" % mobile)
6. 把django中的短信發(fā)送模塊和相關(guān)常量配置文件直接移動(dòng)到當(dāng)前sms任務(wù)目錄中
mycelery/
├── config.py
├── __init__.py
├── main.py
└── sms/
    ├── __init__.py
    ├── tasks.py
    └── yuntongxun
        ├── CCPRestSDK.py
        ├── __init__.py
        ├── sms.py
        └── xmltojson.py
7. 在django里面, 我們調(diào)用celery來異步執(zhí)行任務(wù), 需要完成2個(gè)步驟:
# 1. 聲明一個(gè)和celery一模一樣的任務(wù)函數(shù),但是我們可以導(dǎo)包來解決
from mycelery.sms.tasks import send_sms

# 2. 調(diào)用任務(wù)函數(shù),發(fā)布任務(wù)
send_sms.delay(mobile,sms_code)
# send_sms.delay() 如果調(diào)用的任務(wù)函數(shù)沒有參數(shù),則不需要填寫任何內(nèi)容
8. 啟動(dòng)項(xiàng)目
celery -A mycelery.main worker --loglevel=info
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI