从零搭建一个django项目-7-注册实现(下)

2022-06-13 13:22:16 浏览数 (4)

今天继续注册功能的实现,写一个用户模型类,获取前端用户名、密码等信息。对密码进行加密,校验用户名和验证码等消息。

01

用户模型

新建一个模型类,记得同步数据库信息。

代码语言:javascript复制
python manage.py makemigrations 
python manage.py migrate
代码语言:javascript复制
class DB_user(models.Model):
    username = models.CharField('用户名', null=True ,blank=True,max_length=32)
    password = models.CharField('密码', null=True ,blank=True,max_length=32)
    email = models.CharField('邮箱',max_length=30 , null=True ,blank=True)
    openid = models.CharField('微信的openid',null=True ,blank=True,max_length=32)
    unionid = models.CharField('微信的unionid',max_length=36 , null=True ,blank=True)
    nickname = models.CharField('微信昵称',max_length=30 , null=True ,blank=True)
    province = models.CharField('省份',max_length=10 , null=True ,blank=True)
    city = models.CharField('地市',max_length=10 , null=True ,blank=True)
    country = models.CharField('国家',max_length=10 , null=True ,blank=True)
    avatarurl = models.CharField('头像url',max_length=1000 , null=True ,blank=True,)
    sex = models.CharField('性别',max_length=1 ,null=True ,blank=True)
    qq = models.CharField('qq',max_length=15 ,null=True ,blank=True)
    weixin = models.CharField('微信号',max_length=20 ,null=True ,blank=True)
    phone = models.CharField('手机号',max_length=11 , null=True ,blank=True)
    type = models.CharField('用户类型(0:网站,1:微信,2:qq',max_length=1 , null=True ,blank=True)
    def __str__(self):
        return str(self.username)

写一个加密类用来加密密码:

注册,首先要判断用户名和邮箱不存在,然后要判断验证码正确,和邮箱是当前的,所以之前发送邮箱验证码时候的session要加一下邮箱信息。

注意取数据库数据的get和filter方法。

django的 objects.filter()方法:django的filter方法是从数据库的取得匹配的结果,返回一个对象列表,如果记录不存在的话,它会返回[]。

django的objects.get()方法:django的get是从数据库的取得一个匹配的结果,返回一个对象,如果记录不存在的话,它会报错。

代码语言:javascript复制
class register(APIView):
    def post(self, request, *args, **kwargs):
        # 如果headerkey为auth - token,即headers = {'auth-token': '1234'}
        # 应该使用request.META.get("HTTP_AUTH_TOKEN")
        # 获取 headerkey中的小写转为大写,横线“-”转为下划线“_”, 并且加上前缀HTTP
        # 尤其注意headerkey中不应该包含HTTP前缀,以及符号"_", 否则会取不到对应的值
        # params用于获取字符串,
        # data:用于获取正文,
        # post方法两个参数都可以使用,get方法只能使用params
        # print(request.META.get("HTTP_AUTH_TOKE",'321'))
        username = request.data.get("username",None)
        password = request.data.get("password",None)
        email = request.data.get("email",None)
        emailcode = request.data.get("emailcode",None)
        if username == None or password == None or email == None:
            payload = {'status': "204", 'error': "参数为空"}
            return Response(payload)
        elif DB_user.objects.filter(username=username):
            payload = {'status': "202", 'error': "用户名已存在"}
            return Response(payload)
        elif DB_user.objects.filter(email=email):
            payload = {'status': "205", 'error': "邮箱已存在"}
            return Response(payload)
        if emailcode != request.session.get('emailcode', None) or  email != request.session.get('email', None):
            payload={'status': "203", 'error': "验证码不正确"}
            return Response(payload)
        else:
            try:
                password = password_encry(password)
                DB_user.objects.create(username=username,password=password,email=email,type=0)
                payload = {'status': "200", 'message': "注册成功"}
            except Exception as e:
                print(e.__str__())
                payload = {'status': "299", 'error': "其他错误"}
                return Response(payload)
        return Response(payload)

再次注册:

换个邮箱用户名注册:

前端改了下提示信息取后端返回的报错:

02

预告

因为我是一边写代码一边写公众号的,本人又是个菜鸟好多东西不会需要查询和咨询别的大佬比如前几天的前端咨询了筱梦同学和干脆面君,今天咨询了测试开发囤货和无敌哥(米洛的测开日记)Nginx问题。所以更新会比较慢。下一节完善登录。

备注:以后我会在结尾发一些我拍的图片。

0 人点赞