注册逻辑实现
经过前面几章的艰苦奋斗,我们终于能够把我们的用户写入到我们的数据库里去了
注册逻辑需要的东西
我们完成注册,这里就需要验证我们用户的手机验证码了,然后用户通过验证后,我们将用户从前端传入的信息放进mysql数据库中。
所以根据逻辑,我们在前端需要获取用户用户名,密码,手机号,邮箱,手机验证码,还有用户协议。在后端,我们需要用serializer进行验证手机验证码,用户是否同意用户协议,然后反序列化存入数据,同时我们需要一个接受post请求数据的视图
最后我们需要给用户一个token在用户登录并开启服务时能找到用户的数据,这个在后面详细介绍
先写一个视图
这里视图的逻辑挺简单的,三级视图中有专门处理post请求并存储字段的视图,CreateAPIView。那我们就创建一个CreateAPIView来获取字段,而且数据并未存到数据库中,所以也不用写queryset了,那就简单的两行代码就可以解决了
class RegisterView(CreateAPIView):
serializer_class = serializers.RegisterSerializer
这里这个serializer我们还没创建,所以不要急。
再写一个serializer
创建,补全,ctrl+B看看你的view找不找的到你的serializer
class RegisterSerializer(serializers.ModelSerializer):
pass
这里好了以后,就写我们的验证和存入逻辑了
确定写入模型和添加的字段
我们之前在项目中已经注册了一个AbstactUser的model,现在我们只需要在serializer中指定这个用户并且添加字段
class RegisterSerializer(serializers.ModelSerializer):
v_password=serializers.CharField(label='vertified_password',write_only=True)
msg_code=serializers.CharField(label='phonecheckcode',write_only=True)
protocal = serializers.CharField(label='protocal',write_only=True)
# token=serializers.CharField(label='JWT_token',read_only=True)
由于还未添加Token内容,就先把这个先注释掉了
class Meta:
model =models.User
fields =('id','username','password','email','phone','v_password','msg_code','protocal')
指定从前端获取字段和模型
重写验证方法
import re
from . import constants
def validate(self, attrs):
protocal=attrs['protocal']
print(protocal)
if(protocal=='bad'):
raise serializers.ValidationError('must agree protocal to be a user')
#这里我设置前端如果用户没有点击协议的checkbox则会往后端传一个bad
username1=attrs['username']
if(re.match(constants.string_test_username,username1)==None):
raise serializers.ValidationError('not a valiable username')
# constants中添加了正则常量检测,检测前端传入用户名,别忘了添加
phonenum=attrs['phone']
msg_code=attrs['msg_code']
redis_con_obj1=get_redis_connection('valid')
correct_phone_code=redis_con_obj1.get('%s'%phonenum+'_msg')
#用前端传入手机号获取后端redis中存储的验证码
correct_phone_code = correct_phone_code.decode()
print('true phone check code:',correct_phone_code)
if(correct_phone_code!=msg_code):
raise serializers.ValidationError('invaliable phone message check code')
#检测前端传入的手机验证码
return attrs
这个函数检测了用户名,手机验证码两个参数,手机验证码是通过手机号码去取的,然后和前端传入的验证码对比来进行验证,这里就完成了注册所有需要验证的逻辑
保存传入数据
def create(self, validated_data):
print(validated_data)
del validated_data['v_password']
del validated_data['msg_code']
del validated_data['protocal']
User=super().create(validated_data)
User.save()
return User
重写create方法,最后存入数据
注册视图
url(r'^register/$',views.RegisterView.as_view())
在urlpattern中添加,完成后端逻辑
前端传入数据
获取数据
$('#sub-btn').click(function () {
var Username=$('#username').val();
var Password=$('#password').val();
var V_Password=$('#cpassword').val();
var Phone=$('#phone').val();
var Email=$('#email').val();
var phone_captcha=$('#phonecheckcode').val();
var checkif=false
})
验证数据
if($('#checkbox1').prop('checked')){
checkif='good';
}
else {
checkif='bad';
}
console.log(checkif);
if(Password!=V_Password){
alert('the vertified password is incorrect')
}
打包并转换成Json数据
var data={
'username':Username,
'password':Password,
'v_password':V_Password,
'phone':Phone,
'email':Email,
'msg_code':phone_captcha,
'protocal':checkif,
}
console.log(data)
var data_str=JSON.stringify(data)
console.log(data_str)
ajax发送数据
$.ajax({
url:'http://127.0.0.1:8000/register/',
method:'POST',
data:data_str,
contentType:'application/json',
dataType:'json',
success:function (data) {
alert('successed')
console.log(data)
console.log(typeof(data))
// token=data['token']
// alert(token)
// localStorage.clear()
// clear local storage
// sessionStorage #disable when the exploror close
// localStorage.token=token
// long term avaliable
// alert(localStorage.token)
// location.href='http://127.0.0.1:8080'
},
error:function (data) {
alert('failed')
console.log(data)
}
})
暂时将有关JWT的部分注释掉,就完成注册的逻辑了
最后预览图
查看后端数据库可以找到用户