手机验证码登录
短信验证码发送
工具
my_utils/rediscli.py
import redis # 导包redis
# 生成一个redis的连接池,方便redis客户端的管理与使用
pool = redis.ConnectionPool(host='localhost', port=6379, db=0, decode_responses=True)
# db: 指明使用Redis的哪个库,redis有16个库,0-15
# decode_responses: 指明取出的字符串,是否进行解码
def get_redis_cli():
"""每次需要redis客户端,就调用该方法,返回一个客户端"""
return redis.Redis(connection_pool=pool)
my_utils/sms_code.py
from ronglian_sms_sdk import SmsSDK
accId = '容联云通讯分配的主账号ID'
accToken = '容联云通讯分配的主账号TOKEN'
appId = '容联云通讯分配的应用ID'
def send_message(mobile, code):
sdk = SmsSDK(accId, accToken, appId)
tid = '容联云通讯创建的模板ID'
datas = (code, 10)
resp = sdk.sendMessage(tid, mobile, datas)
print(resp)
视图
from rest_framework.views import APIView # API
from rest_framework.response import Response # 返回
from utils.sms_code import send_message
from .models import User # 导包自带用户
from utils.redisCli import get_redis_cli
import random
class SMSCodeAPIView(APIView):
def post(self, request):
# 1. 接收手机号
mobile = request.data.get('mobile')
# 2. 判断手机号是否为空
if not mobile:
return Response({'msg': '手机号为空'}, status=400)
# 3. 判断手机号对应的用户是否存在
try:
user = User.objects.get(mobile=mobile)
except User.DoesNotExist:
return Response({'msg': '该手机号未注册'}, status=400)
# 4. 获取redis客户端
redis_cli = get_redis_cli()
# 4.1 获取短信验证码标志
flag = redis_cli.get('flag_%s' % mobile)
# 4.2 验证短信发送标志是否存在
if flag:
return Response({'msg': "短信发送过于频繁"}, status=400)
# 5. 生成短信验证码
code = '%06d' % random.randint(0, 999999)
# 5.1 验证码存入redis,设置过期时间为10min
redis_cli.set('code_%s' % mobile, code, ex=600)
# 5.2 发送标志存入redis, 设置过期时间为1min
redis_cli.set('flag_%s' % mobile, 1, ex=60)
# 6. 发送短信验证码
send_message(mobile, code)
# 7.返回响应
return Response({'msg': '发送成功'}, status=200)
短信验证码登录
视图
-
接收参数:手机号、验证码
-
校验参数
-
参数是否都存在
-
手机号对应的用户是否存在
-
-
获取redis中的验证码
-
取不到,说明 已过期,返回登录失败
-
-
比对,验证码
-
一样,登录成功,返回token
-
不一样,返回登录失败
-
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework_jwt.settings import api_settings
from .models import User
from utils.redisCli import get_redis_cli
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
# 短信验证码登录
class SMSCodeLoginAPIView(APIView):
def post(self, request):
# 1. 获取参数
mobile = request.data.get('mobile')
code = request.data.get('code')
# 2. 校验参数
# 2.1 参数是否存在
if not all([mobile, code]):
return Response({'msg': '缺少必要参数'}, status=400)
# 2.2 手机号是否注册
try:
user = User.objects.get(mobile=mobile)
except User.DoesNotExist:
return Response({'msg': '手机号未注册'}, status=400)
# 3, 取出redis中的验证码
redis_cli = get_redis_cli()
redis_code = redis_cli.get('code_%s' % mobile)
# 4. 对比验证码
if code == redis_code:
# 5. 生成token
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
# 返回
return Response({
'msg': '登录成功',
'token': token,
'username': user.username
})
else: # 否则返回
# 4.1 不一致,登录失败
return Response({'msg': '登录失败'}, status=400)