1.创建app
django-admin startapp login
注册app,INSTALLED_APPS里边加入login
2.设计表结构
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class User(AbstractUser):
mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号')
class Meta:
db_table = 'tb_users'
verbose_name = '用户'
verbose_name_plural = verbose_name
def __str__(self):
return self.username
进行迁移
python manage.py makemigrations
python manage.py migrate
3.注册、手机号或账号登录视图
class Register(APIView):
def post(self, request):
# 获取前端传来的userName,pwassword,mobile
name = request.data.get("username")
pwd = request.data.get('password')
mobile = request.data.get('mobile')
# 校验
if not all([name, pwd, mobile]):
# 失败
return Response({"msg": '请输入用户名或密码', "code": '400'})
else:
num = User.objects.filter(mobile=mobile).count()
if num > 0:
return Response({'msg': '手机号已被注册', "code": '400'})
# 成功校验
else:
# 加密写入数据库
user = User.objects.create_user(username=name, password=pwd, mobile=mobile)
return Response({"msg": '注册成功', "code": '200', "user": user.username})
# 登录
class Login(APIView):
def post(self, request):
# 获取前端传来的数据
username = request.data.get('username')
pwd = request.data.get("password")
# user = authenticate(username, password)
print('获取', pwd, username)
# 进行密码校验
# 1. 校验用户名是否在数据库
try:
user = User.objects.get(Q(username=username) | Q(mobile=username))
except Exception as e:
return Response({"msg": "用户不存在!", "code": "400"})
if check_password(pwd, user.password):
# 校验成功
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
# print('++++++++++', token)
return Response({"msg": "登录成功", "code": "200", 'token': token, "user": {"username": user.username}})
else:
return Response({"msg": "用户名和密码不一致!"})
4.配置相关路由
urlpatterns = [
path('register/', views.Register.as_view()),
path('login/', views.Login.as_view()),
]