天天看點

django+celery使用阿裡雲短信服務異步發送注冊驗證碼

網站注冊時通常都會使用短信驗證碼,以防止機器惡意注冊網站,阿裡雲短信服務是國内較大的短信服務平台,使用阿裡雲短信服務實作驗證碼發送也是非常的簡單,相關文檔:https://helpcdn.aliyun.com/document_detail/59210.html,python發送短信驗證碼文檔:

https://help.aliyun.com/document_detail/55491.html。

按照文檔,我們需要注冊阿裡雲賬号,進入控制台,建立AccessKey:

django+celery使用阿裡雲短信服務異步發送注冊驗證碼
django+celery使用阿裡雲短信服務異步發送注冊驗證碼

然後添加簽名和模版,簽名和模闆是需要稽核的,一般2個小時左右。

python發送短信驗證碼需要傳遞幾個參數:

django+celery使用阿裡雲短信服務異步發送注冊驗證碼
django+celery使用阿裡雲短信服務異步發送注冊驗證碼

同時需要傳回幾個值:

django+celery使用阿裡雲短信服務異步發送注冊驗證碼

下載下傳SDK并解壓,在解壓目錄中進入項目開發所需的虛拟環境,執行:

python setup.py install

django+celery使用阿裡雲短信服務異步發送注冊驗證碼

解壓目錄中的demo_sms_send.py檔案中為我們提供了發送短信的demo程式,我們隻需要将demo中的代碼稍作修改放到django項目中就可以實作短信驗證發送的功能了。

第一步:将aliyunsdkdysmsapi包複制到項目中,因為功能的實作依賴這個包:

因為是異步發送短信,是以将其放在Celery_tasks檔案下,友善導入

django+celery使用阿裡雲短信服務異步發送注冊驗證碼

第二步:在settings.py中配置ACCESS_KEY_ID和ACCESS_KEY_SECRET,即在阿裡雲控制台建立AccessKey時生成的AccessKey ID和Access Key Secret:

django+celery使用阿裡雲短信服務異步發送注冊驗證碼

第三步:在tasks.py檔案中編寫短信驗證碼發送功能:

使用celery需要配置,具體請通路:https://blog.csdn.net/weixin_44951273/article/details/100525958,定時任務和異步任務相同,隻需要把settings中的CELERYBEAT_SCHEDULE注釋掉即可。

from celery import Celery
import os
import django
from .aliyunsdkdysmsapi.request.v20170525 import SendSmsRequest
from aliyunsdkcore.client import AcsClient
import uuid
from aliyunsdkcore.profile import region_provider
from django.conf import settings
import random
import json
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'frenshshop.settings')
django.setup()
app = Celery("Celery_tasks.tasks",broker=settings.BROKER_URL)

# 注意:不要更改
REGION = "cn-hangzhou"
PRODUCT_NAME = "Dysmsapi"
DOMAIN = "dysmsapi.aliyuncs.com"

acs_client = AcsClient(settings.ACCESS_KEY_ID, settings.ACCESS_KEY_SECRET, REGION)
region_provider.add_endpoint(PRODUCT_NAME, REGION, DOMAIN)

@app.task
def register_active_sms_task(phone):
    smsRequest = SendSmsRequest.SendSmsRequest()
    code = random.randrange(1000, 9999)  # 随機生成四位數驗證碼
    smsRequest.set_TemplateCode("SMS_174690097")  # 申請的短信模闆編碼,必填
    smsRequest.set_TemplateParam(json.dumps({"code":code}))  # 設定短信模闆中的code值,即短信驗證碼
    smsRequest.set_OutId(uuid.uuid1())  # 設定業務請求流水号,必填
    smsRequest.set_SignName("天天生鮮")  # 短信簽名
    smsRequest.set_PhoneNumbers(phone)  # 短信發送的号碼清單,必填
    smsResponse = acs_client.do_action_with_exception(smsRequest)  # 調用短信發送接口,傳回json
    print(smsResponse)
           

第四步:編寫視圖函數,調用異步函數:

def send_phone(request):
    phone = request.POST.get("phone")
    register_active_sms_task.delay(phone) # 調用異步函數實作短信驗證碼發送,傳遞phone參數
    return JsonResponse({"code":200,"message":"發送成功","data":{}})
           

第五步:啟動項目、redis、django-celery:

python manage.py runserver # 啟動項目
python manage.py celery worker -l info # 啟動celery worker,處理任務
python manage.py celery beat -l info # 啟動celery beat,負責把任務分發給worker
# 為了友善測試,也可以同時啟動worker和beat,但此方法windows,隻能分别啟動。linux可行。
python manage.py celery worker -B -l info
           
django+celery使用阿裡雲短信服務異步發送注冊驗證碼
django+celery使用阿裡雲短信服務異步發送注冊驗證碼
django+celery使用阿裡雲短信服務異步發送注冊驗證碼

此時點選前端發送按鈕背景接收到手機号碼就可以進行短信驗證碼發送了:

django+celery使用阿裡雲短信服務異步發送注冊驗證碼

可以看到短信已“成功”發送,列印的smsResponse中有三個參數,code參數的值為:

isv.AMOUNT_NOT_ENOUGH

,意思是賬戶餘額不足,因為我們有充錢,别問我為什麼,問就是因為窮,但發送短信驗證碼的大體思路就是這樣。