当前位置: 首页 > news >正文

Django+Vue3前后端分离学习(四)(登录功能实现)

1、序列化数据:

创建serializers.py的python文件

从rest_framework里导入serializers类:

from rest_framework import serializers
class LoginSerializer(serializers.Serializer):email = serializers.EmailField(required=True, error_messages={"required": "请输入邮箱!"})password = serializers.CharField(max_length=20, min_length=6)# 重写校验def validate(self, attrs):email = attrs.get('email')password = attrs.get('password')if email and password:user = OAUser.objects.filter(email=email).first()if not user:raise serializers.ValidationError("请输入正确的邮箱!")if not user.check_password(password):raise serializers.ValidationError("请输入正确的密码!")# 判断状态if user.status == UserStatusChoices.UNACTIVE:raise serializers.ValidationError("该用户尚未激活!")elif user.status == UserStatusChoices.LOCKED:raise serializers.ValidationError("该用户已被锁定,请联系管理员!")# 为了节省执行SQL语句的次数,这里我们把user直接放到attrs中,方便在视图中使用attrs['user'] = userelse:raise serializers.ValidationError('请传入邮箱和密码!')return attrs

2、创建authentications.py文件

安装jwt:

pip install PyJWT
import jwt
import time
from django.conf import settings
from rest_framework.authentication import BaseAuthentication, get_authorization_header
from rest_framework import exceptions
from jwt.exceptions import ExpiredSignatureError
from .models import OAUserdef generate_jwt(user):expire_time = time.time() + 60 * 60 * 24 * 7return jwt.encode({"userid": user.pk, "exp": expire_time}, key=settings.SECRET_KEY)class UserTokenAuthentication(BaseAuthentication):def authenticate(self, request):# 这里的request:是rest_framework.request.Request对象return request._request.user, request._request.authclass JWTAuthentication(BaseAuthentication):keyword = 'JWT'def authenticate(self, request):auth = get_authorization_header(request).split()if not auth or auth[0].lower() != self.keyword.lower().encode():return Noneif len(auth) == 1:msg = "不可用的JWT请求头!"raise exceptions.AuthenticationFailed(msg)elif len(auth) > 2:msg = '不可用的JWT请求头!JWT Token中间不应该有空格!'raise exceptions.AuthenticationFailed(msg)try:jwt_token = auth[1]jwt_info = jwt.decode(jwt_token, settings.SECRET_KEY, algorithms='HS256')userid = jwt_info.get('userid')try:# 绑定当前user到request对象上user = OAUser.objects.get(pk=userid)setattr(request,'user', user)return user, jwt_tokenexcept:msg = '用户不存在!'raise exceptions.AuthenticationFailed(msg)except ExpiredSignatureError:msg = "JWT Token已过期!"raise exceptions.AuthenticationFailed(msg)

3、登录的话涉及增删改查,所以直接用rest_framework提供的APIView

导入:

from rest_framework.views import APIView
from .serializers import LoginSerializer, UserSerializer
from .authentications import generate_jwt
from rest_framework.response import Response
class LoginView(APIView):def post(self, request):# 1. 验证数据是否可用serializer = LoginSerializer(data=request.data)if serializer.is_valid():user = serializer.validated_data.get('user')user.last_login = datetime.now()user.save()# 生成tokentoken = generate_jwt(user)return Response({'token': token, 'user': UserSerializer(user).data})else:# person = {"username": "张三", "age": 18}# person.values() = ['战三', 18] dict_valuesdetail = list(serializer.errors.values())[0][0]# drf在返回响应是非200的时候,他的错误参数名叫detail,所以我们这里也叫做detailreturn Response({"detail": detail}, status=status.HTTP_400_BAD_REQUEST)

User对象实例化 使用serializers.ModelSerializer:

class UserSerializer(serializers.ModelSerializer):class Meta:model = 0AUserfields = "__all__"

嵌套定义:

class DepartmentSerializer(serializers.ModelSerializer):class Meta:model = OADepartmentfields = "__all__"class UserSerializer(serializers.ModelSerializer):department = DepartmentSerializer()class Meta:model = OAUser# fields = "__all__"exclude = ('password', 'groups', 'user_permissions')

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 景联文科技:提供高质量多模态数据标注,推动智能化转型
  • Google数字车钥匙:引领汽车互动新纪元
  • GitHub Copilot的详细介绍
  • 15 Python模块
  • IDEA Maven 源修改为国内阿里云镜像的正确方式
  • 【x265】预测模块的简单分析—帧间预测
  • springboot提升-切面编程
  • macos系统内置php文件列表 系统自带php卸载方法
  • 沐渥科技:两显氮气柜和三显氮气柜要怎么选择?
  • FPGA开发:可编程逻辑器件概述
  • vue中的css深度选择器
  • 基于STM32的RTOS--freertos的使用(HAL实现多任务)
  • react 子组件调用父组件方法,获取的数据不是最新值
  • 用RNN(循环神经网络)预测股票价格
  • 前端技术(六)—— AJAX详解
  • php的引用
  • JavaScript-如何实现克隆(clone)函数
  • 【347天】每日项目总结系列085(2018.01.18)
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • java8-模拟hadoop
  • mysql 数据库四种事务隔离级别
  • mysql外键的使用
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • vue中实现单选
  • 半理解系列--Promise的进化史
  • 对象管理器(defineProperty)学习笔记
  • 记一次和乔布斯合作最难忘的经历
  • 聊聊sentinel的DegradeSlot
  • 马上搞懂 GeoJSON
  • 驱动程序原理
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​secrets --- 生成管理密码的安全随机数​
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #DBA杂记1
  • #Z0458. 树的中心2
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (C#)获取字符编码的类
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (论文阅读40-45)图像描述1
  • ***监测系统的构建(chkrootkit )
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET连接数据库方式
  • .net中我喜欢的两种验证码
  • /*在DataTable中更新、删除数据*/
  • @Controller和@RestController的区别?
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [Android]Android P(9) WIFI学习笔记 - 扫描 (1)
  • [AutoSar NVM] 存储架构