# views.py
# 登录视图
class LoginView(ViewSet):# 登录@action(methods=['POST'], detail=False)def login(self, request, *args, **kwargs):ser_obj = ser.UserModelSerializer(data=request.data)if ser_obj.is_valid():token = ser_obj.context['token']username = ser_obj.context['user'].usernameuser = ser_obj.context['user']return response.ApiResponse(token=token, username=username, is_superuser=user.is_superuser)else:return response.ApiResponse(code=0, msg=ser_obj.errors)# 手机号验证@action(methods=['GET'], detail=False)def check_telephone(self, request):telephone = request.query_params.get('telephone')if re.match('^1[3-9][0-9]{9}$', telephone):user = models.UserInfo.objects.filter(telephone=telephone).first()if user:return response.ApiResponse(result=True)else:return response.ApiResponse(result=False)else:return response.ApiResponse(code=0, msg='手机号不合法')
# 发送验证码视图
class SmsView(ViewSet):# 如果项目要上线,最好加上下边的频率限制类,该类没有写^_^# throttle_classes = [throttlings.SmsThrotting]# 发送验证码@action(methods=['GET'], detail=False)def send_sms(self, request):telephone = request.query_params.get('telephone')if re.match('^1[3-9][0-9]{9}$', telephone):user = models.UserInfo.objects.filter(telephone=telephone).first()# print(user.username)if user:print('用户存在')code = send_sms.get_code()if send_sms.send(code, telephone):cache.set('code', code, 60)print(cache.get('code'))return response.ApiResponse(code=100, msg='发送验证码成功')else:return response.ApiResponse(msg='未知错误')else:print('用户不存在')return response.ApiResponse(code=2, msg='手机号不存在')else:return response.ApiResponse(msg='号码不符合规范,傻der')# 验证码登录@action(methods=['POST'], detail=False)def sms_login(self, request):telephone = request.data['telephone']code = request.data['code']if str(code) == str(cache.get('code')):user = models.UserInfo.objects.filter(telephone=telephone).first()if user:# 获取签发payload = jwt_payload_handler(user)# 签发encode成tokentoken = jwt_encode_handler(payload)return response.ApiResponse(token=token, username=user.username, is_superuser=user.is_superuser)else:return response.ApiResponse(code=0, msg='用户不存在')else:return response.ApiResponse(code=2, msg='验证码过期或者不正确')
# ser.py
class UserModelSerializer(ModelSerializer):username = serializers.CharField(max_length=32)class Meta:model = models.UserInfofields = ['username', 'password', 'id']extra_kwargs = {'id': {'read_only': True},'password': {'write_only': True}}def validate(self, attrs):# 验证用户user = self._get_user(attrs)# 签发tokentoken = self._get_token(user)# 将验证后的数据保存下来,给视图使用self.context['token'] = tokenself.context['user'] = userreturn attrsdef _get_user(self, attrs):username = attrs.get('username')password = attrs.get('password')import re# 后台验证账号类型if re.match('^1[3-9][0-9]{9}$', username):user = models.UserInfo.objects.filter(telephone=username).first()elif re.match('^.*@.*$', username):user = models.UserInfo.objects.filter(email=username).first()else:user = models.UserInfo.objects.filter(username=username).first()if user:ret = user.check_password(password)if ret:user.last_login = datetime.datetime.now()user.save()return userelse:raise ValidationError('密码错误')else:raise ValidationError('用户不存在')def _get_token(self, user):# 获取签发payload = jwt_payload_handler(user)# 签发encode成tokentoken = jwt_encode_handler(payload)return tokenclass RegisterSerializer(serializers.ModelSerializer):code = serializers.CharField(max_length=4)class Meta:model = models.UserInfofields = ['telephone', 'code', 'password']extra_kwargs = {'password': {'write_only': True, 'max_length': 11, 'min_length': 3}}def validate(self, attrs):code = attrs.get('code')telephone = attrs.get('telephone')password = attrs.get('password')import reif re.match('^1[3-9][0-9]{9}$', telephone):user = models.UserInfo.objects.filter(telephone=telephone).first()if user:raise ValidationError('用户已经存在')if code == cache.get('code'):return attrselse:raise ValidationError('验证码不正确')else:return ValidationError('手机号不合法')return attrsclass RegisterView(ViewSet):# 注册@action(methods=['POST'], detail=False)def register(self, request):ser_obj = ser.RegisterSerializer(data=request.data)telephone = request.data['telephone']password = request.data['password']if ser_obj.is_valid():user = models.UserInfo.objects.create_user(username=telephone, telephone=telephone, password=password)token = self._get_token(user)return response.ApiResponse(msg='注册成功', token=token, username=user.username)else:return response.ApiResponse(code=0, msg='用户已经存在或者手机号不合法或者验证码不正确')# 注册通过验证码注册@action(methods=['GET'], detail=False)def register_send_sms(self, request):telephone = request.query_params.get('telephone')if re.match('^1[3-9][0-9]{9}$', telephone):user = models.UserInfo.objects.filter(telephone=telephone).first()code = send_sms.get_code()if send_sms.send(code, telephone):# if 1:cache.set('code', code, 60)print(cache.get('code'))return response.ApiResponse(code=100, msg='发送验证码成功')else:return response.ApiResponse(msg='未知错误')else:return response.ApiResponse(msg='号码不符合规范,傻der')def _get_token(self, user):# 获取签发payload = jwt_payload_handler(user)# 签发encode成tokentoken = jwt_encode_handler(payload)return token
# urls.py
from rest_framework.routers import SimpleRouter
router = SimpleRouter()# 注册用户的登录,验证码,注册路由
router.register('',views.LoginView,'login')
router.register('',views.SmsView,'send')
router.register('',views.RegisterView,'register')

基于jwt的登录/注册功能实现相关推荐

  1. Django练习——基于Mysql的登录注册功能界面(django模型、模板、表单简单应用)

    目录 1.创建 2.配置Mysql (1)连接数据库驱动 (2)创建表格 (3)创建迁移文件并同步到数据库 3.admin后台 (1)创建超级用户 (2)注册模型login_msg 4.路由与视图 4 ...

  2. java wed登录面 代码_JavaWeb实现用户登录注册功能实例代码(基于Servlet+JSP+JavaBean模式)...

    下面通过通过图文并茂的方式给大家介绍JavaWeb实现用户登录注册功能实例代码,一起看看吧. 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBea ...

  3. php注册登录描述,基于PHP实现用户登录注册功能的详细教程

    教程前先给大家看看小编的实现成果吧! 图1: 图2: 图3: 教程: 实现这个功能我们需要五个php文件: login.php (登录界面,如图2) 登录 登录页面 用户名: required=&qu ...

  4. 基于android校园订餐APP,简单实现登录注册功能(SharedPreferences)

    基于android校园订餐APP,简单实现登录注册功能(SharedPreferences) 欢迎浏览本篇文章 界面效果图 页面设计代码 源代码 欢迎浏览本篇文章 大家好! 这是小编首次在博客上写的文 ...

  5. spring 3.x 学习笔记_spring mvc、spring jdbc 实现网站的登录注册功能

    使用spring mvc.spring jdbc 实现网站的登录注册功能 1.        据业务模型 创建model 一般实现序列化 2.        用spring 注解(@Repositor ...

  6. html登陆注册功能实现,实现用户的登录注册功能

    在基于Spring Boot框架上,实现用户的登录注册功能, 首先分析前期所需要的规划. 1 实现登录注册 前端向后端发起post请求 2用户密码安全性 密码是不推荐明文入库的,在后台采取秘钥加加不可 ...

  7. 基于Bootstrap的登录注册模板(html+css)

    基于Bootstrap的登录&注册模板(html+css) 1.简介 2.功能 2.1 登录 2.2 注册 3.展示 4.下载地址 1.简介 基于Bootstrap的登录&注册模板(h ...

  8. Spring boot 搭建个人博客系统(二)——登录注册功能

    Spring boot 搭建个人博客系统(二)--登录注册功能 一直想用Spring boot 搭建一个属于自己的博客系统,刚好前段时间学习了叶神的牛客项目课受益匪浅,乘热打铁也主要是学习,好让自己熟 ...

  9. java实现用户登录注册功能(用集合框架来实现)

    需求:实现用户登录注册功能(用集合框架来实现) 分析: A:需求的类和接口 1.用户类 UserBean 2.用户操作方法接口和实现类 UserDao UserDaoImpl 3.测试类 UserTe ...

最新文章

  1. 玉山银行的一名新员工“玉山小i随身金融顾问”
  2. 13.4.虚拟化工具--jmap详解
  3. 安卓进阶系列-08异步加载AsynsTask使用
  4. 使系统生成50个0-9之间的随机数,将每个数字出现的次数 存入一个一维数组中,统计出现次数最多和出现次数最少的数字,及出现次数 和出现频率。...
  5. makefile obj文件路径_Makefile一问:如何修改.o输出文件的输出路径 Linux/Unix社区 / 程序开......
  6. 微软中国回应关闭实体直营店:中国市场保持正常营运
  7. 计算机信息数据集通信的概念,南京信息工程大学数据通信与计算机网络复习题库.doc...
  8. python在线学习直播-马哥教育官网-专业Linux培训班,Python培训机构
  9. Apache Maven 入门篇 ( 上 )
  10. 1. TensorFlow 2.8(2.5\2.6\2.x) GPU windows 安装教程
  11. android 画布线条加粗,Android 对TextView添加删除线,下划线,加粗,斜体等效果
  12. 2017百度之星资格赛:1004. 度度熊的午饭时光(01背包+记录路径)
  13. 图像检索 - 评价指标
  14. android上的sip软电话
  15. 斐波那契(黄金分割法)查找算法(FibonacciSearch)
  16. Android之——多媒体开发视频格式
  17. 最迷你的瑞典大学,如何建立起了影响全球的游戏发展体系
  18. 台州 OJ 3847 Mowing the Lawn 线性DP 单调队列
  19. sequelize-auto自动生成model...
  20. python可以开发软件_python可以开发软件吗

热门文章

  1. 【Qt开发】QDate类
  2. 1T移动硬盘的移动硬盘为什么只有931G
  3. 用Java写一个公司员工管理系统!
  4. 用Canvas画布展示出3D效果的网页源码
  5. oracle 扩充processes,增加连接数processes
  6. MySQL数据库-详解
  7. 软件设计模式与花边针法与书法
  8. 【毕设狗】【单片机毕业设计】基于单片机的控制窗帘电路的设计
  9. NodeJS插件验证:Jenkins官方Alpine镜像之LTS版本
  10. 量子通信及计算机,您对量子通信和量子计算机怎么看?