开通阿里云短信服务
- 申请签名和模板
- 下载pythonSDK
pip install aliyun-python-sdk-core
- 设置AK和SK
封装发短信代码utils/BaseView.py
- import json
- from aliyunsdkcore.client import AcsClient
- from aliyunsdkcore.request import CommonRequest
- from syl.settings import ALY_ACCESSKEY_SECRET, ALY_ACCESSKEY_ID
- # phone = ""
- # phone_code = ""
- # data = {"code": phone_code}
- def send_sms(phone, data):
- # accessKeyId
- # accessSecret
- # cn-hangzhou
- client = AcsClient('', '', 'cn-hangzhou')
- request = CommonRequest()
- request.set_accept_format('json')
- request.set_domain('dysmsapi.aliyuncs.com')
- request.set_method('POST')
- request.set_protocol_type('https') # https | http
- request.set_version('2017-05-25')
- request.set_action_name('SendSms')
- request.add_query_param('RegionId', "cn-hangzhou")
- request.add_query_param('PhoneNumbers', phone)
- request.add_query_param('SignName', "美多商城")
- request.add_query_param('TemplateCode', "SMS_185212884")
- request.add_query_param('TemplateParam', data)
- response1 = client.do_action(request)
- # python2: print(response)
- res=json.loads(str(response1, encoding='utf-8'))
- 短信发送和验证的逻辑
- # verificationsapp/view.py 发送接口 #
- #verificationsapp/VIEW.PY
- class SendSMSCode(APIView):
- def post(self, request):
- # 获取数据
- phone = request.data.get("phone")
- image_code = request.data.get("image_code")
- image_code_uuid = request.data.get("image_code_uuid")
- print('=====================', phone, image_code_uuid, image_code)
- # 验证数据
- if not all([phone, image_code, image_code_uuid]):
- return Response({"code": 4005, "msg": "参数不全"})
- # 逻辑与入库
- # 3、验证图片验证码是否正确
- # 3.1连接redis
- redis_cli = get_redis_connection("img_code")
- # 3.2拿着uuid获取图片验证码
- redis_img_code = redis_cli.get(image_code_uuid).decode('utf-8')
- # 3.3比对redis里的code和发来的code是否一致
- if image_code.lower() != redis_img_code.lower():
- return Response({"code": 4009, "msg": "图片验证码错误"})
- # 4、使用阿里云发送短信
- # 4.1准备手机验证码
- number = random.randint(100000, 999999)
- data = {"code": number}
- print(data)
- # 4.2使用封装好的接口发送短信
- send_sms(phone, data)
- # 5.将短信验证码绑定并存入redis
- redis_cli.setex(phone, 60 * 60, number)
- # 6.删除image_code
- redis_cli.delete(image_code_uuid)
- return Response({"code": 0, "msg": "发送成功"})
后记
近期有很多朋友通过私信咨询有关Python学习问题。为便于交流,点击蓝色自己加入讨论解答资源基地