以发送短信,用户传过来的手机号进行验证举例,
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