手机验证码

手机短信发送本人推荐使用阿里大于,只是我免费的金额已经用完,现在用云片网来演示.最后也会附上阿里大鱼的短信发送代码.

一、准备工作

  • 1、注册云片网
  • 2、配置签名及模板管理(必须的)

    签名与模板

  • 3、将你发送短信的服务器或者你本机的ip设置到ip白名单中

    ip白名单

二、在django项目中新建一个utils的方法

  • 1、在控制面板中拷贝你的api_keysettings.py文件中
  • 2、关于短信发送的文档传送门
  • 3、定义一个实用的类

    import json
    from test import settings
    
    import requests
    
    class YunPianClient(object):
        """
        定义云片网发送手机短信的
        """
    
        def __init__(self):
            self.client = settings.YUN_PIAN_API_KEY
            self.single_send_url = 'https://sms.yunpian.com/v2/sms/single_send.json'
    
        def send_sms(self, moblie, code):
            params = {
                'apikey': self.client,
                'mobile': moblie,
                # 注意这个模板是要从你配置的模板中拷贝过来,不然发送会失败
                'text': '【水痕】您的验证码是{code}。如非本人操作,请忽略本短信'.format(code=code)
            }
            response = requests.post(self.single_send_url, data=params)
            return json.loads(response.text)
    
    if __name__ == '__main__':
        yunpian = YunPianClient()
        r = yunpian.send_sms(moblie='xxxxxx', code='1234')
        print(r.text)
        print(r.status_code)
        # {"code":0,"msg":"发送成功","count":1,"fee":0.05,"unit":"RMB","mobile":"xxx","sid":27178534084}
    
  • 4、补充代码(生成随机数的)

    def generate_code(self):
        """
        定义一个生成验证码的函数
        :return:
        """
        seeds = '0123456789'
        random_list = []
        for i in range(4):
            random_list.append(choice(seeds))
    
        return ''.join(random_list)
    

三、django中实现一个短信发送的功能

  • 1、定义一个工具类跟上面的一样的
  • 2、定义serializer

    import re
    from rest_framework import serializers
    from django.conf import settings
    # 引入缓存的包
    from django.core.cache import cache
    
    class SmsSerializer(serializers.Serializer):
        """
        用于用户发送手机验证码的serializer类
        """
        mobile = serializers.CharField(label='手机号码', max_length=11, min_length=11, required=True,
                                      error_messages={'required': '手机号码必填', 'min_length': '手机号码格式错误',
                                                      'max_length': '手机号码格式错误'})
    
        def validate_mobile(self, mobile):
            """
            验证手机号码的函数
            :param mobile:
            :return:
            """
    
            # 判断用户是否已经注册
            if User.objects.filter(mobile=mobile).count():
                raise serializers.ValidationError('该用户已经存在')
    
            # 正则判断手机号码格式
            if not re.match(settings.REGEX_MOBILE, mobile):
                raise serializers.ValidationError('手机号码格式错误')
    
            # 缓存中获取手机号码是否在20分钟内已经发送过短信的
            if cache.get(mobile):
                raise serializers.ValidationError('手机验证码已经发送,请查收短信')
    
            return mobile
    
  • 3、在视图返回

    from rest_framework.mixins import CreateModelMixin
    from rest_framework.viewsets import GenericViewSet
    from rest_framework.response import Response
    from rest_framework import status
    from users import serializers
    
    from random import choice
    from utils.yun_pian_client import YunPianClient
    
    # 引入缓存的包
    from django.core.cache import cache
    
    class SmsCodeView(CreateModelMixin, GenericViewSet):
        """
        定义一个发送手机验证码的视图类
        """
        serializer_class = serializers.SmsSerializer
    
        @property
        def generate_code(self):
            """
            定义一个生成验证码的函数
            :return:
            """
            seeds = '0123456789'
            random_list = []
            for i in range(4):
                random_list.append(choice(seeds))
    
            return ''.join(random_list)
    
        def create(self, request, *args, **kwargs):
            """
            重写创建函数
            :param request:
            :param args:
            :param kwargs:
            :return:
            """
            serializer = self.get_serializer(data=request.data)
            serializer.is_valid(raise_exception=True)
    
            mobile = serializer.validated_data['mobile']
            yun_pian = YunPianClient()
            code = self.generate_code
            sms_result = yun_pian.send_sms(moblie=mobile, code=code)
    
            if sms_result['code'] != 0:
                return Response({
                    'mobile': sms_result['msg']
                }, status=status.HTTP_400_BAD_REQUEST)
            else:
                # 设置缓存
                cache.set(mobile, code)
                return Response({
                    'mobile': mobile
                }, status=status.HTTP_201_CREATED)
    
  • 4、注册路由

results matching ""

    No results matching ""