用户模块--用户表设计及注册

使用django自带的用户模块,继承(AbstractUser)添加我们自己的表字段

utils.MyBaseModel.py中创建基础model类
from django.db import models


# 设置基类,每个继承这个模型类的模型都会具有这两个字段
class Base(models.Model):
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间", null=True)
    update_time = models.DateTimeField(auto_now=True, null=True, verbose_name="更新时间")

    class Meta:
        abstract = True

userapp.models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
from utils.MyBaseModel import Base


# Create your models here.

class Vip(Base):
    vip_choise = (
        ('0', '普通用户'),
        ('1', '普通会员'),
        ('2', '高级会员'),
    )
    title = models.CharField('vip名称', max_length=16)
    vip_type = models.CharField('Vip种类', choices=vip_choise, max_length=4, default='0')
    desc = models.CharField('vip描述', max_length=255)
    period = models.IntegerField('有效期', default=365)

    class Meta:
        db_table = 'tb_vip'

    def __str__(self):
        return self.title


# AbstractUser是django用户组件里的用户模型类,继承以后对原来的模型类进行改写
class User(AbstractUser):
    phone = models.CharField('手机号', max_length=20, null=True)
    img = models.ImageField(max_length=256, null=True)
    nick_name = models.CharField('昵称', max_length=20, null=True)
    address = models.CharField('地址', max_length=255, null=True)
    email = models.CharField('邮箱', max_length=255, null=True)
    vip = models.ForeignKey(Vip, on_delete=models.SET_NULL, default=None, null=True)
    vip_expiration = models.DateField('vip到期时间', blank=True, default=None, null=True)

    class Meta:
        db_table = 'tb_user'

在settings.py 中告诉django使用自己写的User模型类来作为django用户组件里的模型类

AUTH_USER_MODEL = 'userapp.User'

注册成功后,生成jwt令牌来验证登录状态

utils.MyBaseView.py下的创建生成jwt令牌函数
from rest_framework_jwt.settings import api_settings

def create_token(user):
    # 生成jwt_token, user对象,查询结果
    jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
    jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
    payload = jwt_payload_handler(user)
    token = jwt_encode_handler(payload)
    return token

数据库迁移
python manage.py makemigrations
python manage.py migrate
写序列化userapp.serializers.py
from django.contrib.auth.hashers import make_password
from rest_framework import serializers
from userapp import models as usermodels
from utils.MyBaseView import create_token


class UserSerializer(serializers.Serializer):
    username = serializers.CharField(max_length=32)
    password = serializers.CharField(max_length=256)
    token = serializers.CharField(max_length=256, read_only=True)

    def create(self, validated_data):
        validated_data['password'] = make_password(validated_data['password'])
        user_obj = usermodels.User.objects.create(**validated_data)
		# 生成 token 添加到user_obj 中一起返回
        token = create_token(user_obj)
        user_obj.token = token
        return user_obj
后台注册userapp.views.py
from django.contrib.auth.hashers import make_password
from rest_framework.views import APIView
from rest_framework.response import Response

from rest_framework_jwt.settings import api_settings
from userapp import models as usermodels
from userapp import serializers as userserializer

from utils.MyBaseView import create_token
# Create your views here.


class Register(APIView):
    def post(self, request):
        username = request.data.get('username')
        password = request.data.get('password')

        if not all([username, password]):
            return Response({'code': 4001, 'msg': '信息不完整'})

        # 方案一:使用create()注册
        # user_obj = usermodels.User.objects.create(username=username, password=make_password(password))
        #
        # token = create_token(user_obj)
        # data = {
        #     'username': user_obj.username,
        #     'token': token
        # }

        # 方案二:使用Serializer序列化注册
        ser_obj = userserializer.UserSerializer(data=request.data)
        ser_obj.is_valid()
        ser_obj.save()

        return Response({'code': 200, 'msg': '注册成功', 'data': ser_obj})

配置userapp.urls.py
from django.urls import path
from userapp import views as userviews

urlpatterns = [
    path('register/', userviews.Register.as_view()),
]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值