文章目录
腾讯云SDK
from tencentcloud.common import credential
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.sms.v20210111 import sms_client, models
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
try:
cred = credential.Credential("T0gF0iU8gJ5XEvW0cLyWzZME97yQipya", "gS0X8vlkfkyKmJzgO4kKlm2OuW4Wug")
httpProfile = HttpProfile()
httpProfile.reqMethod = "POST"
httpProfile.reqTimeout = 300
httpProfile.endpoint = "sms.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.signMethod = "TC3-HMAC-SHA256"
clientProfile.language = "en-US"
clientProfile.httpProfile = httpProfile
client = sms_client.SmsClient(cred, "ap-guangzhou", clientProfile)
req = models.SendSmsRequest()
req.SmsSdkAppId = "14008852"
req.SignName = "蟒蛇梦想家公众号"
req.TemplateId = "20579"
req.TemplateParamSet = ["520"]
req.PhoneNumberSet = ["+86"]
req.SessionContext = ""
req.ExtendCode = ""
req.SenderId = ""
resp = client.SendSms(req)
print(resp.to_json_string(indent=2))
except TencentCloudSDKException as err:
print(err)
短信封装
import random
import json
from rest_framework.exceptions import APIException
def get_code(length):
code = ''
for i in range(length):
code += str(random.randint(0, 9))
return code
from tencentcloud.common import credential
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.sms.v20210111 import sms_client, models
from . import settings
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
def common_send_sms(code, mobile):
try:
cred = credential.Credential(settings.SECRET_ID, settings.SECRET_KEY)
httpProfile = HttpProfile()
httpProfile.reqMethod = "POST"
httpProfile.reqTimeout = 300
httpProfile.endpoint = "sms.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.signMethod = "TC3-HMAC-SHA256"
clientProfile.language = "en-US"
clientProfile.httpProfile = httpProfile
client = sms_client.SmsClient(cred, "ap-guangzhou", clientProfile)
req = models.SendSmsRequest()
req.SmsSdkAppId = settings.APP_ID
req.SignName = settings.SIGN
req.TemplateId = settings.TEMPLATE_ID
req.TemplateParamSet = [code]
req.PhoneNumberSet = ["+86" + str(mobile)]
req.SessionContext = ""
req.ExtendCode = ""
req.SenderId = ""
resp = client.SendSms(req)
resp = json.loads(resp.to_json_string(indent=2))
if resp.get('SendStatusSet')[0].get('Code') == 'Ok':
return True
else:
return False
except Exception as e:
raise APIException(detail=str(e))
SECRET_ID = "KIDT0gF0iU8gJ5XEvW0cLyWzZME97yQipya"
SECRET_KEY = "JsS0X8vlkfkyKmJzgO4kKlm2OuW4Wug"
APP_ID = '14885290'
TEMPLATE_ID = '057994'
SIGN = "蟒蛇梦想家公众号"
from rest_framework.viewsets import ViewSet,GenericViewSet
from rest_framework.decorators import action
from utils.common_response import APIResponse
from rest_framework.exceptions import APIException
from rest_framework.response import Response
class APIResponse(Response):
def __init__(self,code=100, msg='成功', status=None,headers=None,**kwargs):
data = {'code':code,'msg':msg}
if kwargs:
data.update(kwargs)
super().__init__(data=data,headers=headers,status=status)
class SmsView(GenericViewSet):
@action(methods=['POST'], detail=False)
def send(self, request):
try:
mobile = request.data['mobile']
code = get_code(6)
cache.set('sms_code_%s' % mobile, code)
res = common_send_sms(code, mobile)
if res:
return APIResponse(msg='短信发送成功')
else:
return APIResponse(code=101, msg='短信发送失败')
except MultiValueDictKeyError:
raise APIException(detail='手机号必须携带')
except Exception as e:
raise APIException(detail=str(e))
短信登录功能
class UserLoginView(GenericViewSet):
@action(methods=['POST'], detail=False)
def sms_login(self, request):
return self._common_login(request)
def get_serializer_class(self):
if self.action == 'sms_login':
return SmsLoginSerializer
else:
return super().get_serializer_class()
def _common_login(self, request):
ser = self.get_serializer(data=request.data, context={'request': request})
ser.is_valid(raise_exception=True)
token = ser.context.get('token')
username = ser.context.get('username')
icon = ser.context.get('icon')
return APIResponse(token=token, username=username, icon=icon)
class CommonLoginSerializer(serializers.Serializer):
def validate(self, attrs):
user = self._get_user(attrs)
token = self._get_token(user)
self._set_context(token, user)
return attrs
def _get_user(self, attrs):
raise Exception('这个方法必须被重写')
def _get_token(self, user):
refresh = RefreshToken.for_user(user)
return str(refresh.access_token)
def _set_context(self, token, user):
request = self.context.get('request')
self.context['token'] = token
self.context['username'] = user.username
self.context['icon'] = settings.BACKEND_URL + '/media/' + str(user.icon)
class SmsLoginSerializer(CommonLoginSerializer):
mobile = serializers.CharField()
code = serializers.CharField()
def _get_user(self, attrs):
code = attrs.get('code')
mobile = attrs.get('mobile')
old_code = cache.get('sms_code_%s' % mobile)
if code == old_code or (settings.DEBUG and code == '8888'):
user = User.objects.filter(mobile=mobile).first()
if user:
return user
else:
raise APIException('用户不存在')
else:
raise APIException('验证码错误')
注册功能
class UserRegister(GenericViewSet):
serializer_class = RegisterSerializer
def create(self, request):
ser = self.get_serializer(data=request.data)
ser.is_valid(raise_exception=True)
ser.save()
return APIResponse(msg='恭喜您,注册成功')
class RegisterSerializer(serializers.ModelSerializer):
code = serializers.CharField()
class Meta:
model = User
fields = ['mobile', 'code', 'password']
def validate(self, attrs):
code = attrs.pop('code')
mobile = attrs.get('mobile')
old_code = cache.get('sms_code_%s' % mobile)
if code == old_code or (settings.DEBUG and code == '6666'):
attrs['username'] = mobile
else:
raise APIException('验证码错误')
return attrs
def create(self, validated_data):
user = User.objects.create_user(**validated_data)
return user