django 注册逻辑实现

注册逻辑实现

经过前面几章的艰苦奋斗,我们终于能够把我们的用户写入到我们的数据库里去了

注册逻辑需要的东西

我们完成注册,这里就需要验证我们用户的手机验证码了,然后用户通过验证后,我们将用户从前端传入的信息放进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的部分注释掉,就完成注册的逻辑了

在这里插入图片描述
最后预览图

查看后端数据库可以找到用户

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值