网站注册时通常都会使用短信验证码,以防止机器恶意注册网站,阿里云短信服务是国内较大的短信服务平台,使用阿里云短信服务实现验证码发送也是非常的简单,相关文档:https://helpcdn.aliyun.com/document_detail/59210.html,python发送短信验证码文档:
https://help.aliyun.com/document_detail/55491.html。
按照文档,我们需要注册阿里云账号,进入控制台,创建AccessKey:
然后添加签名和模版,签名和模板是需要审核的,一般2个小时左右。
python发送短信验证码需要传递几个参数:
同时需要返回几个值:
下载SDK并解压,在解压目录中进入项目开发所需的虚拟环境,执行:python setup.py install
解压目录中的demo_sms_send.py文件中为我们提供了发送短信的demo程序,我们只需要将demo中的代码稍作修改放到django项目中就可以实现短信验证发送的功能了。
第一步:将aliyunsdkdysmsapi包复制到项目中,因为功能的实现依赖这个包:
因为是异步发送短信,所以将其放在Celery_tasks文件下,方便导入
第二步:在settings.py中配置ACCESS_KEY_ID和ACCESS_KEY_SECRET,即在阿里云控制台创建AccessKey时生成的AccessKey ID和Access Key Secret:
第三步:在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
此时点击前端发送按钮后台接收到手机号码就可以进行短信验证码发送了:
可以看到短信已“成功”发送,打印的smsResponse中有三个参数,code参数的值为:isv.AMOUNT_NOT_ENOUGH
,意思是账户余额不足,因为我们有充钱,别问我为什么,问就是因为穷,但发送短信验证码的大体思路就是这样。