DRF实现手机验证码登录

该博客介绍了如何实现短信验证码登录的过程,包括通过Redis管理验证码、使用容联云通讯发送短信以及验证登录的详细步骤。在登录视图中,首先检查手机号是否已注册,然后从Redis获取验证码进行对比,最后成功时生成JWT token返回。
摘要由CSDN通过智能技术生成

手机验证码登录

     短信验证码发送

      工具

  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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值