drf多方式登录接口(手机号、邮箱、验证码)登录
题目
##### 3 多方式登录接口####
-使用auth的user表扩写
-用户名+密码
-手机号+密码
-邮箱+密码
-签发token逻辑,放在序列化类中写
方式一:
serializer.py
from rest_framework import serializers
from .models import UserInfo
from rest_framework.exceptions import ValidationError
import re
from rest_framework_jwt.settings import api_settings
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
class UserSerializer(serializers.ModelSerializer):
username = serializers.CharField() # 这个优先用这个,就不是映射过来的,就没有unique的限制了
class Meta:
model = UserInfo
# 大坑:继承ModelSerializer后,fields的字段是映射过来的
# username 是unique唯一的,反序列化校验的时候,字段自己的规则,会去数据库查询有没有这个用户,如果有,直接报错了
fields = ['username','password'] # 只做反序列化的校验
# 这个东西的返回值必须是个字典,校验过后的数据
def validate(self,attrs): # attr是前端传入的,校验过后的数据,先校验字段自己的然后局部钩子最后全局钩子
# 1.获取前端传入的数据
username = attrs.get('username')
password = attrs.get('password')
# 2.查用户是否存在(先查出用户再校验密码,查用户有三种类型:手机号,邮箱,用户名)
if re.match(r'^1[3-9][0-9]{9}$', username):
user = UserInfo.objects.filter(phone=username).first()
elif re.match(r'^.+@.+$', username):
user = UserInfo.objects.filter(email=username).first()
else:
user = UserInfo.objects.filter(username=username).first()
if user and user.check_password(password): # 再校验密码
# 3.签发token
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
self.user = user
self.token = token
return attrs
else:
raise ValidationError('用户名或密码错误')
views.py
from rest_framework.viewsets import ViewSet
from .serializer import UserSerializer
from rest_framework.response import Response
class UserView(ViewSet):
def login(self,request):
# 1 得到一个序列化类
ser = UserSerializer(data=request.data)
if ser.is_valid(): # 执行全局钩子
user = ser.user
token = ser.token
return Response({'code': 100, 'msg': '登录成功', 'token': token, 'username': user.username})
else:
return Response({'code': 100, 'msg': ser.errors})
urls.py
path('login/',views.UserView.as_view({'post':'login'}))
方式二:
serializer.py
from rest_framework_jwt.settings import api_settings
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
from rest_framework import serializers
from django.contrib.auth import authenticate
class UserSerializer(serializers.Serializer):
username = serializers.CharField()
password = serializers.CharField()
def validate(self, attrs):
credentials = {
'username':attrs.get('username'),
'password': attrs.get('password')
}
if all(credentials.values()):
user = authenticate(**credentials)
if user:
if not user.is_active:
msg = '滚蛋'
raise serializers.ValidationError(msg)
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
self.token = token
return {
'token':token,
'user': user
}
else:
msg = '用户名密码错误'
raise serializers.ValidationError(msg)
else:
msg = '必须填写用户名和密码'
raise serializers.ValidationError(msg)
backends.py
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from .models import UserInfo
class LoginBackend(ModelBackend):
# 校验规则可以自己写
def authenticate(self, request, username=None, password=None, **kwargs):
user = UserInfo.objects.get(Q(username=username) | Q(phone=username) | Q(email=username))
if user is not None and user.check_password(password):
return user
settings.py
AUTHENTICATION_BACKENDS = [
'app01.backends.LoginBackend'
]
views.py
from rest_framework.viewsets import ViewSet
from rest_framework.response import Response
from .serializer import UserSerializer
from .jwt_response import common_response
class UserView(ViewSet):
def login(self,request):
ser = UserSerializer(data=request.data)
if ser.is_valid():
username = ser.validated_data.get('user')
token = ser.validated_data.get('token')
response_data = common_response(token, username, request)
response = Response(response_data)
return response
return Response(ser.errors)
urls.py
urlpatterns = [
path('login/',views.UserView.as_view({'post':'login'})),
]
drf多方式登录接口(手机号、邮箱、验证码)登录的更多相关文章
- Vue——手机号、验证码登录(设置按钮60s禁用倒计时)
最近在做一个Vue项目,前端通过手机号.验证码登录,获取验证码按钮需要设置60s倒计时(点击一次后,一分钟内不得再次点击).先看一下效果图: 输入正确格式的手机号码后,“获取验证码”按钮方可点击:点击 ...
- wepy 实现 用户名登录与短信验证码登录
wepy 实现 用户名登录与短信验证码登录
- Springboot+Vue实现短信与邮箱验证码登录
体验网址:http://mxyit.com 示例 1.新增依赖 <!-- 短信服务 --> <dependency> <groupId>com.aliyun< ...
- shiro整合shiro多验证登录(账号密码登录和使用手机验证码登录)
1. 首先新建一个shiroConfig shiro的配置类,代码如下: @Configuration是标识这个类是一个配置文件,在启动时会加载这个类里面的内容,这个配置文件的位置的一定一定一定不能 ...
- outlook配置其他邮箱登录如qq邮箱或登录无邮件信息记录
今天加班想想自己outlook还没登登录过,于是想着登录一下outlook方便管理邮箱信息,才发现原来登录邮箱都要配置,感觉真是醉了.下面开始正式的配置流程. 选择添加账户 首先,点击文件选择账户设置 ...
- 原始js---JavaScript注册用正则验证用户名密码手机号邮箱验证码
注册文件 reg.html <html><style> #btn{ background-color: red; color:white; width: 235px; } sp ...
- Luffy /4/ 多方式登录接口&登录注册前端页面
目录 Luffy /4/ 多方式登录接口&登录注册前端页面 腾讯云短信 登录注册前端页面 如何实现点击登录或图片进行跳转 登录注册前端页面实现 Login.vue Register.vue H ...
- Python实战项目6-后端多方式登录接口/手机登录接口
为开源项目共享代码 步骤: 1先fork开源项目 2clone下来,修改代码,进行提交 3提交pr,等作者同意 Pycharm 使用Git 右键文件会列出Git命令 登录注册功能分析 多方式登录接口: ...
- 为开源项目贡献代码-pycharm使用git-登录注册功能分析-判断手机号存在接口-多种方式登录接口-腾讯云短信申请
目录 为开源项目贡献代码-pycharm使用git-登录注册功能分析-判断手机号存在接口-多种方式登录接口-腾讯云短信申请 git内容大回顾 今日内容概要 今日内容详细 1 为开源项目贡献代码 2 p ...
- python接口自动化:绕过验证码登录
上线产品的登录接口会有验证码,一般可以通过添加cookie的方式绕过验证码. 一.抓登录的cookie 1. 先手动登录一次,然后用fiddler抓取这个cookie,再直接把这个值添加到cookie ...
随机推荐
- C++/Qt网络通讯模块设计与实现(四)
在C++/Qt网络通讯模块设计与实现(三)中提到了一个概念,即接受者所依附的线程:关注我微信公众号的技术朋友留言对该概念还是不解,这节就单独讲述这个概念的理论与实际应用,这种应用无处不在,因为与Qt的 ...
- ThreadLocal部分源码分析和应用场景
结构演进 早起JDK版本中,ThreadLocal内部结构是一个Map,线程为key,线程在"线程本地变量"中绑定的值为Value.每一个ThreadLocal实例拥有一个Map实 ...
- 南昌航空大学-软件学院-22206104-段清如-JAVA第一次Blog作业
南昌航空大学-软件学院-22206104-段清如-JAVA第一次Blog作业 前言: 这个学期才开始接触java,到现在一个多月的时间,已经差不多可以写出一些基本的简单的程序了.对比上个学期学习的C语 ...
- VUE2.x原理之Object.defineProperty()
Object.defineProperty()语法说明 Object.defineProperty()的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性 Object.defineP ...
- 第一次博客:PTA题目集1-3总结
第一次博客:PTA题目集1-3总结 前言:JAVA是一门非常好的语言,因其面向对象的思想,在解决问题时思路与上学期学习的C语言截然不同,但是其优势也是显然易见的,特别是在写大型程序时其面向对象的思想, ...
- selenium验证码处理-打码平台操作
1.进入打码平台(超人,斐斐) 斐斐-------官网: 超人-------官网: 2.选择对应的开发文档,下载对应的demo示例,并把demo的python脚本放到项目包管理地址去 参考: 超人的开 ...
- 0002 嵌入式开发带你从小白到大佬系列之——Linux文件系统、常用文件操作命令(一)及用户权限
1.熟悉Linux的文件系统结构 Linux的文件系统结构其实是一个树形的分层组织结构,如下图: Linux系统目录结构及目录路径: 1.1.文件系统层次结构标准 Linux是开源的操作系统,各个Li ...
- 数据泵:oracle数据泵导入导出部分用户
问题描述:需要将140服务器中的tbomnew实例下的部分用户导入到118服务器下的tbompx实例中,本次导入导出的两个数据库均为19C 部分用户名:CORE,MSTDATA,BOMMGMT,CFG ...
- Redis(七)缓存穿透、缓存击穿、缓存雪崩以及分布式锁
应用问题解决 1 缓存穿透 1.1 访问结构 正常情况下,服务器接收到浏览器发来的web服务请求,会先去访问redis缓存,如果缓存中存在数据则直接返回,否则会去查询数据库里面的数据,然后保存在red ...
- SpringBoot开启日志级别
#开启logging logging.level.org.springframework.boot.autoconfigure: error logging: level: main.blog.map ...