(生鲜项目)17. drf实现发送短信验证码功能

第一步; 前期分析

由于之前在设计model的时候, 我们已经决定对code进行数据库保存, 所以这里我们应该使用 mixins.CreateModelMixin

同时, 用户发过来的手机号码, 我们在后端应该执行自己的验证, 包括

  • 手机号码是否被注册
  • 手机号码是否合法  [在settings.py中加上 REGEX_MOBILE="^1[358]\d{9}$|^147\d{8}$|^176\d{8}$"]
  • 两次验证码的间隔是否大于60秒

基于以上考虑, 我们需要创建一个 serializers

在写serializers逻辑的时候, 要注意这里我们不能像之前写goods那样, 把serializers和users.models.VerifyCode绑定起来, 因为VerifyCode的code是必填字段, 但是用户获取验证码只需要手机号码即可

如果要单独使用serializers并对其中的某个字段进行验证, 需要重写validate_字段名()函数

验证码code应该在发送成功之后再保存, 以防止用户猜到了code, 而登录成功

第二步; 写代码

首先写user.serializers.py

import re
from datetime import datetime, timedelta
from rest_framework import serializers
from django.contrib.auth import get_user_model  

from MxShop.settings import REGEX_MOBILE
from .models import VerifyCode

User = get_user_model() # 可以获取数据库的userprofile表

# 验证手机号码
class SmsSerializer(serializers.Serializer):
    mobile = serializers.CharField(max_length=11)

    # 单独对mobile字段进行验证
    def validate_mobile(self, mobile):
        # 手机号是否注册
        if User.objects.filter(mobile=mobile).count():
            raise serializers.ValidationError("用户已经存在")

        # 手机号码是否合法
        if not re.match(REGEX_MOBILE, mobile):
            raise serializers.ValidationError("手机号码非法")

        # 验证发送频率
        one_minute_ago = datetime.now() - timedelta(hours=0, minutes=1, seconds=0)
        if VerifyCode.objects.filter(add_time__gt=one_minute_ago, mobile=mobile).count():
            raise serializers.ValidationError("距离上一次发送未超过60s")

        # 验证通过
        return mobile

然后写user.views.py

from django.shortcuts import render
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model
from django.db.models import Q
from rest_framework.mixins import CreateModelMixin
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework import status
from random import choice

from .serializers import SmsSerializer
from utils.yunpian import YunPian
from MxShop.settings import APIKEY
from .models import VerifyCode

User = get_user_model()# 发送短信验证码
class SmsCodeViewset(CreateModelMixin,viewsets.GenericViewSet):
    serializer_class = SmsSerializer

    # 生成随机验证码的函数
    def generate_code(self):
        seeds="1234567890"
        code_lst=[]
        for i in range(4):
            code_lst.append(choice(seeds))
        return "".join(code_lst)

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True) # 如果serializer不通过, 那么后面就不会执行,而且drf会自动封装400的状态码

        # 上面的mobile字段校验成功后,获取mobile, 并对其发送验证码
        mobile=serializer.validated_data["mobile"] # validated_data就是serializer返回的数据, 是一个字典
        yunpian = YunPian(APIKEY)
        code=self.generate_code()
        sms_status = yunpian.send_sms(code=code,mobile=mobile)

        # 如果发送失败,把错误信息填充给mobile,同时封装一个400的状态码
        if sms_status["code"] != 0:
            return Response(
                {"mobile":sms_status["msg"]},
                status=status.HTTP_400_BAD_REQUEST
            )
        else: # 如果发送成功就先保存code到数据库, 然后返回手机号码,并封装201状态码
            code_record=VerifyCode(code=code,mobile=mobile)
            code_record.save()
            return Response(
                {"mobile":mobile},
                status=status.HTTP_201_CREATED
            )

然后是settings.py

# 手机号码正则表达式
REGEX_MOBILE="^1[358]\d{9}$|^147\d{8}$|^176\d{8}$"

# 云片网设置
APIKEY = "cdb6f4b3860c552f790176a9e4f3fd85"

最后是urls.py, 注册一个验证码接口

# 发送验证码的接口
router.register(r‘code‘, SmsCodeViewset, basename="code")

然后去浏览器测试

---  君子处其实,不处其华;治其内,不治其外   张居正  ----

原文地址:https://www.cnblogs.com/jiangzongyou/p/12111093.html

时间: 2024-10-09 04:47:03

(生鲜项目)17. drf实现发送短信验证码功能的相关文章

Thinkphp 3.2中注册发送短信验证码功能(未进行盗刷处理版本)

好多人都感觉脱离了增删改查的功能都很难,实际上不是的,可能有些教程只是讲了核心的部分,导致一些基础不太好的同学有些蒙逼,本人作为一个基础不太好的同学,今天就从基础开始说说i哈 1.首先,想用短信服务,就得先有个阿里云帐号,然后去购买短信,购买后,然后你去生成一个app_id和key的值,声称这个值不用代码,在阿里云后台就可以生成的,然后生成一个模版,这个你们自己找就行,然后生成一个短信签名,短信签名是干什么的呢?给你们举个列子,一般广告短信都是[阿里云]迎十一大酬宾...或者[链家]十一大优惠,

Java演示手机发送短信验证码功能实现

我们这里采用阿里大于的短信API 第一步:登陆阿里大于,下载阿里大于的SDK 第二步:解压相关SDK,第一个为jar包,第二个为源码 第三步:引入到项目中 第四步:代码测试短信是否成功 第五步:Java Application 运行 最终结果:如下图为成功发送一条短信

程序君带你畅聊发送短信验证码

现在不管是网站,还是app等互联网和移动互联网产品,绝大部分注册都是直接用手机号注册登录的,方式就是给手机发送短信验证码,然后把验证码填入,后台程序去匹配判断用户填入的验证码和发送的是否一致. 我最近做的好几个项目都用到了发送短信验证码的这个第三方接口,其实这个发送验证码的原理很简单,实现也很简单. 如下三个图,是我做的其中一个项目的相关效果截图: 我用的比较多的第三方短信接口是容联-云通讯的(http://www.yuntongxun.com/),它的API挺强大的,也挺稳定的,使用也不难,有

JAVA利用第三方平台发送短信验证码。

前段时间自己做的一个小项目中,涉及到用短信验证码登录.注册的问题,之前没涉及过这一块,看了别人的博客其实也是似懂非懂的,现在就将自己做的利用第三方短信平台来发送验证码这个功能记下来. 本文以注册为例,在SpringMVC+Spring+Mybatis框架的基础上完成该短信验证码功能. 发送短信验证码的原理是:随机生成一个6位数字,将该6位数字保存到session当中,客户端通过sessionid判断对应的session,用户输入的验证码再与session记录的验证码进行比较. 为了防止有广告嫌疑

超实用的JavaScript代码段 Item4 --发送短信验证码

发送短信验证码 实现点击“发送验证码”按钮后,按钮依次显示为“59秒后重试”.“58秒后重试”…直至倒计时至0秒时再恢复显示为“发送验证码”.在倒计时期间按钮为禁用状态 . 第一步.获取按钮.绑定事件.设置定时器变量和计时变量 第二步.添加定时器,每隔1秒钟计时减 1,直至当计时小于等于 0 时清除定时器,按钮恢复为“发送验证码”,否则显示为“X秒后重试” <!doctype html> <html lang="en"> <head> <met

阿里云短信服务发送短信验证码(JAVA开发此功能)

开发此功能需注册阿里云账号,并开通短信服务(免费开通) 充值后,不会影响业务的正常使用!(因为发送验证类短信:1-10万范围的短信是0.045元/条).开发测试使用,充2块钱测试足够了 可参考阿里云官方开发文档了解详情,文档中写的也是很详细了... https://help.aliyun.com/product/44282.html 代码编写之前需要准备几个东西 1,aliyun-java-sdk-core.jar ,  aliyun-java-sdk-dysmsapi.jar  这2个jar包

各大APP注册时发送短信验证码是怎么实现的?

回答这个问题可以从多个角度来回答,比如商务角度和技术角度,为了快速清晰的让广大的读者了解这个过程,本文我们从商务角度来深入分析. 实现原理 现各大APP发送短信的服务一般是由第三方短信服务商提供的,他们整合了移动,联通.电信三方资源,三网都可以发送,这样就不需要直接对接运营商了. 发送短信验证码主要是为了验证手机方的真实性,实现原理简单说就是系统先生成一个验证码,调用第三方服务商的短信接口,发送到手机方,手机方输入验证码,再由系统去校验是否符合,符合则说明手机真实有效. 服务商选择 提供短信接入

android发送短信验证码并自动获取验证码填充文本框

android注册发送短信验证码并自动获取短信,截取数字验证码填充文本框. 一.接入短信平台 首先需要选择短信平台接入,这里使用的是榛子云短信平台(http://smsow.zhenzikj.com), 两分钟申请测试账号,赠送了100条测试短信. android使用java的jar包即可开发 jar下载: http://smsow.zhenzikj.com/doc/sdk.html API文档:http://smsow.zhenzikj.com/doc/java_sdk_doc.html 使用

python利用第三方模块,发送短信验证码

对于初学者,如何利用第三方python开发包发送短信验证码,下面是具体的实现和记录过程! 环境:虚拟机上centos7平台,python3.7版本: 第三方短信平台:榛子云短信(smsow.zhenzikj.com) SDK下载地址: smsow.zhenzikj.com/sdkdownload- 注意要下载python3的 API文档: smsow.zhenzikj.com/doc/python_- 首先,申请账号的部分就省略了 1. 获得appid和appSecret 使用申请的账号,登录用