目录
认证组件
访问某个接口,需要登录后才能访问
编写模型表
class User(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=32)
user = models.OneToOneField(to='UserToken', on_delete=models.CASCADE, null=True)
class UserToken(models.Model): # 跟User是一对一
token = models.CharField(max_length=32)
# user :反向,表名小写,所有有user字段
登录接口
路由
router.register('user', views.UserView, 'user') # /api/v1/user/login post
视图类
from .models import User, UserToken
import uuid
# 登录接口 自动生成路由+由于登录功能,不用序列化,继承ViewSet
class UserView(ViewSet):
@action(methods=['POST'],detail=False)
def login(self, request):
print(request.data)
username = request.data.get('username')
password = request.data.get('password')
user = User.objects.filter(username=username, password=password).first()
print(user)
if user:
# 用户存在,登录成功
# 生成一个随机字符串---uuid
token = str(uuid.uuid4()) # 生成一个永不重复的随机字符串
"""
# 在userToken表中存储一下,
1.从未登录过>>插入一条数据 新增
2.登录过>>修改数据 可用if判断
根据kwargs,传入的东西查找,能找到就使用defaults的更新,否则就新增一条
"""
UserToken.objects.update_or_create(user=user, defaults={'token': token})
return Response({'code': '100', 'msg': '登录成功', 'token': token})
else:
return Response({'code': '101', 'msg': '用户名或密码错误'})