-
注册容联云账号
-
使用容联云发送短信
# 安装容联云
pip install ronglian_sms_sdk
''' 短信发送代码 '''
#libs/rl_sms.py
from ronglian_sms_sdk import SmsSDK
accId = '上图ACCOUNT SID'
accToken = '上图AUTH TOKEN'
appId = '上图APPID'
def send_message(phone,datas):
sdk = SmsSDK(accId,accToken, appId)
tid = '1' # 测试模板id为: 1. 内容为: 【云通讯】您的验证码是{1},请于{2}分钟内正确输 入。
# mobile = '13303479527'
# datas = ('666777', '5')
# 模板中的参数按照位置传递
resp = sdk.sendMessage(tid, phone, datas)
return resp
-
在视图函数中使用
# verifications/urls.py 中添加路由
urlpatterns = [
path('sms_codes/', views.SmsCodeView.as_view()),
]
# 写视图函数
# verifications/views.py
from rest_framework.permissions import AllowAny
from rest_framework.views import APIView
from rest_framework.response import Response
import re
import random
from utils.rl_sms import send_message
class SmsCodeView(APIView):
# 1.所有人可以访问
permission_class = (AllowAny, )
def post(self, request):
# 1.获取参数
phone = request.data.get('phone')
image_code = request.data.get('image_code')
image_code_uuid = request.data.get('image_code_uuid')
# 2.检查参数
if not all([phone, image_code, image_code_uuid]):
return Response({"code":999, "msg":"参数不全"})
if not re.match(r'^1[3456789]\d{9}$', phone):
return Response({"code":999, "msg":"手机号码不正确"})
# 3.检查是否发送
redis_client = get_redis_connection('img_code')
phone_exists = redis_client.get(phone)
if phone_exists:
return Response({"code":999, "msg":"发送频繁,请稍后再试"})
redis_image_code = redis_client.get(image_code_uuid) #bytes
if rediss_image_code:
# bytes 转成 string
redis_image_code = redis_image_code.decode()
# 比较用户提供的图片内容是否和redis中保存的一致
if image_code.upper() != redis_image_code:
return Response({'code':999, 'msg':'图片验证码不正确'})
# 4. 发送
code = '%06d' % random.randint(0,999999) # 随机6位验证码
send_resp = send_message(phone, (code, "5"))
# 5.1 保存code到redis中
# redis_client.delete(image_code_uuid)
# 5.2 从redis中删除这个图片验证码,以防再次使用
# redis_client.delete(image_code_uuid)
# 5.3使用pipeline 批量操作
pl = redis_client.pipeling()
pl.setex(phone, 60*5, code)
pl.delete(image_code_uuid)
pl.execute()
# 6. 返回结果
return Response({"code":0, "msg":"短信发送成功"})