使用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()),
]