DRF如何使用serializer进行验证数据

以发送短信,用户传过来的手机号进行验证举例,
serializer对前端传过来的参数进行验证
路由:

from rest_framework.routers import DefaultRouter
from user.views import SmsCodeViewSet
router=DefaultRouter()
#发送短信验证码
router.register('code',SmsCodeViewSet,basename='code')


urlpatterns = [
    path('xadmin/', xadmin.site.urls),
    url('^ueditor/', include('DjangoUeditor.urls')),
    # 图片相关展示
    url(r'^media/(?P<path>.*)$', serve, {"document_root": MEDIA_ROOT}),
    url('^', include(router.urls)),
    # restframework配置
    url('^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]

view视图:

class SmsCodeViewSet(CreateModelMixin,viewsets.GenericViewSet):
    """
    发送手机短信验证码
    """
    serializer_class = SmsSerializer
    #生成验证码
    code="%04d" % random.randint(0, 10000)

    def create(self, request, *args, **kwargs):
        serializer=self.get_serializer(data=request.data)

        # 如果数据无效就返回400状态码(请求参数错误)
        serializer.is_valid(raise_exception=True)

        mobile=serializer.validated_data["mobile"]
        api_key="发送短信的api_key"
        #实例化发送短信类
        yun_pian=YunPian(api_key=api_key)
        #调用发送短信函数
        sms_status=yun_pian.send_sms(code=self.code,mobile=mobile)
        if sms_status["code"]!=0:
            return Response({
                'mobile':sms_status["msg"]
            },status=status.HTTP_400_BAD_REQUEST)

        else:
            verify_code=VerifyCode(code=self.code,mobile=mobile)
            verify_code.save()
            return Response({
                "mobile":mobile
            },status=status.HTTP_201_CREATED)

serializer类:

from django.contrib.auth import get_user_model
User=get_user_model()

class SmsSerializer(serializers.Serializer):
    mobile=serializers.CharField(max_length=11)

    def validate_mobile(self,mobile):
        """
        验证手机号码
        :param data: 
        :return: 
        """
        # 手机是否注册
        if User.objects.filter(mobile=mobile).count():
            raise serializers.ValidationError("该用户已注册")

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

        # 验证码发送频率
        one_minits_ago=datetime.now()-timedelta(hours=0,minutes=1,seconds=0)
        if VerifyCode.objects.filter(add_time__gt=one_minits_ago,mobile=mobile).count():
            raise serializers.ValidationError("验证码发送太过于频繁,请稍后再试!")

        return mobile
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值