Django实现微信商城小程序后端-注册与登录

目前先实现用户普通的用户名密码注册、登录,后边会改成第三方登录或短信验证码登录,其实都差不多。

model

用户表包含了常用的基本信息

# 用户信息表
class User(models.Model):
    id = models.AutoField(primary_key=True)
    username = models.CharField(max_length=32, unique=True, verbose_name='姓名', default='')
    # gender_choices = ((0,'女'), (1, '男'), (-1, '无'))
    gender = models.CharField(max_length=16, verbose_name='性别', default='未知')
    age = models.PositiveIntegerField()
    phone_number = models.CharField(max_length=16, unique=True, verbose_name='手机号')
    email = models.EmailField(unique=True, verbose_name='邮箱')
    password = models.CharField(max_length=64, verbose_name='密码')
    create_time = models.DateTimeField(auto_now_add=True)
    update_time = models.DateTimeField(auto_now=True)
    id_delete = models.BooleanField(default=False)

    class meta:
        db_table = 'user'
        verbose_name = '用户'
        verbose_name_plural = '用户'

    def __str__(self):
        return self.username

view

根据用户登录名密码进行验证,验证通过生成token返回给用户,以后请求需要携带token

from django.http import Http404
from django.shortcuts import render, HttpResponse, redirect
from django.views import View
from django.core.cache import cache
from rest_framework import viewsets, views
from rest_framework.response import Response
from .auth import LoginAuth
from .models import *
from .util import uuid4, pwd_hash, info, JwtToken
from .serializers import UserSerializer, UserRegSerializer

class Index(View):
    def get(self, request):
        dic = {
            # 'uuid': 'eg',
            'name': '张三',
            'gender': 1,
            'age': 24
        }
        print(uuid4())
        obj = User.objects.create(**dic)
        print(obj)
        # raise Http404
        return HttpResponse('index')


class Login(views.APIView):
    # authentication_classes = [LoginAuth] # token验证

    # post请求
    def post(self, request):
        try:
            data = request.data      # 获取接收的参数
            password = data.pop('password')    # 抽离出密码
            data['password'] = pwd_hash(password)     # Hash密码,不存储明文密码
            user = User.objects.filter(**data,id_delete=False).values().first() # 查询 没有删除的用户
            user_ser = UserSerializer(data=user)  # 序列化数据
            user_ser.is_valid() # 序列化返回值校验
            # 判断是否存在该用户
            if user:
                # 生成token
                jwt_token = JwtToken()
                token = jwt_token.encode_token(dict(user_ser.data))

                # 将数据转换成dict类型,并添加token到返回数据中
                data = dict(user_ser.data)
                data['token'] = token
                # 返回数据
                return info(data=data)
            return info(status=0, message='用户名或密码错误')
        except Exception as e:
            return info(status=0, message='服务器内部错误')


class UserView(viewsets.ModelViewSet):
    queryset = User.objects.all().filter(id_delete=True)
    serializer_class = UserSerializer

    # def create(self, request, *args, **kwargs):
    #     print(request.data)
    #     serializer = self.get_serializer(data=request.data)
    #     serializer.is_valid(raise_exception=True)
    #     self.perform_create(serializer)
    #     headers = self.get_success_headers(serializer.data)
    #     return Response(serializer.data, headers=headers)


class Register(viewsets.ModelViewSet):

    def create(self, request, *args, **kwargs):
        try:
            # 序列化数据
            serializer = UserRegSerializer(data=request.data)
            # 验证数据,遇到错误主动抛出
            if serializer.is_valid(raise_exception=True):
                self.perform_create(serializer)
            return info(data=serializer.data)
        except Exception as e:
            # 获取参数
            err = e.args[0]
            if 'email' in err:
                return info(message='用户已注册')
            if 'phone_number' in err:
                return info(message='手机号已注册')

            # 获取缺少的字段
            key = [k for k,v in err.items()]
            return info(status=0, message='缺少字段' + str(key))
        
        except:
            return info(status=0, mes

serializers

from .models import *
from rest_framework import serializers, status
from .util import pwd_hash
import re


# 密码验证
def my_validate(val):
    try:
        re.search('[A-Z]+', val).group()
    except:
        raise serializers.ValidationError('密码应包含大写字母')
    if len(val) < 8:
        raise serializers.ValidationError('密码应大于8位')
        # return Response('密码太短')


class UserSerializer(serializers.ModelSerializer):
    def create(self, validated_data):
        print(validated_data)
        password = validated_data.pop('password')
        validated_data['password'] = pwd_hash(password)
        user_obj = User.objects.create(**validated_data)
        return user_obj

    class Meta:
        model = User
        fields = ['username', 'gender', 'age', 'phone_number', 'email', 'password']
        extra_kwargs = {'password': {'write_only': True, "validators": [my_validate]}}

注册

新用户注册

request参数
{
“username”: “李一三”,
“gender”: “男”,
“age”: “36”,
“phone_number”:“14395474448”,
“email”: “di87209@126.com”,
“password”: “1234567”
}
注册成功会返回注册信息

已经注册过的用户

返回值
{
“status”: 1,
“message”: “用户已注册”,
“data”: “”
}

登录

验证成功后的返回值
{
"status": 1,
"message": "",
"data":{
"username": "李一",
"gender": "男",
"age": 36,
"phone_number": "14395974448",
"email": "di872909@126.com",
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1c2VybmFtZSI6ICJcdTY3NGVcdTRlMDAiLCAiZ2VuZGVyIjogIlx1NzUzNyIsICJhZ2UiOiAzNiwgInBob25lX251bWJlciI6ICIxNDM5NTk3NDQ0OCIsICJlbWFpbCI6ICJkaTg3MjkwOUAxMjYuY29tIiwgImlhdCI6IDE1ODgyMjY5ODMsICJleHAiOiAxNTg4MjMwNTgzfQ.Pg-xZfl17FtYWyimUdHKEnR19QbLBo5_DqLF3YmorCM0pTxA1wBMBwx4PXDL0htlHANpl-dss5C6SnBJ6qGBoxa-7Zva6lpUMDdZXHdBpGYvM7EL-r-xtf0K7HFIf-73oWkjvgfW5t1BHuijtItje6CmeyrlWG0DDANkddXjeQt57uTk1eGm-gZ6nX5EnhK0f_hPk5ok0JtVSCLWjjsHRyXLI4o3zT6VHhD8Cl7Mm5AWa1h3JeSmxbvcbvHSqZ21os94SVpzNLlqoVnRQPsTXFHcls_3_-vy6JY6o-ukMpuyEL6SAcz-kKeUn8VdlbmljjHY6VScV2a9i9r_LLDPGA"
}
}
登录错误返回值
{
"status": 0,
"message": "用户名或密码错误",
"data": ""
}
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值