首页 > 其他分享 >八、多种登陆方式接口 短信验证码接口

八、多种登陆方式接口 短信验证码接口

时间:2024-02-05 17:14:08浏览次数:28  
标签:username code 短信 get 验证码 接口 return user import

 

多种登陆方式接口

# 路由
from django.urls import path,include
from . import views
from rest_framework.routers import SimpleRouter
router=SimpleRouter()
router.register('',views.LoginView,'login')
urlpatterns = [
    path('',include(router.urls) ),
]

# 视图类
from rest_framework.viewsets import ViewSet
from . import serializer
from luffyapi.utils.response import APIResponse
from rest_framework.decorators import action
class LoginView(ViewSet):
    @action(methods=['POST'],detail=False)
    def login(self,request,*args,**kwargs):
        ser=serializer.UserSerilaizer(data=request.data)
        if ser.is_valid():
            token=ser.context['token']
            username=ser.context['user'].username
            return APIResponse(token=token,username=username)
        else:
            return APIResponse(code=0,msg=ser.errors)
# 序列化类
from rest_framework import serializers
from . import models
from rest_framework.exceptions import ValidationError
class UserSerilaizer(serializers.ModelSerializer):
    username=serializers.CharField()
    class Meta:
        model=models.User
        fields=['username','password','id']
        extra_kwargs={
            'id':{'read_only':True},
            'password':{'write_only':True}
        }

    def validate(self, attrs):

        # 多种登录方式
        user=self._get_user(attrs)
        # 签发token
        token=self._get_token(user)
        # 放到context中,我在视图类中可以取出来
        self.context['token']=token
        self.context['user']=user


        return attrs


    def _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.User.objects.filter(telephone=username).first()
        elif re.match('^.+@.+$',username):  #邮箱
            user=models.User.objects.filter(email=username).first()
        else:
            user=models.User.objects.filter(username=username).first()
        if user:
            ret=user.check_password(password)
            if ret:
                return user
            else:
                raise ValidationError('密码错误')
        else:
            raise ValidationError('用户不存在')

    def _get_token(self,user):
        from rest_framework_jwt.serializers import jwt_payload_handler,jwt_encode_handler
        payload=jwt_payload_handler(user)  # 通过user对象获得payload
        token=jwt_encode_handler(payload) # 通过payload获得token
        return token

手机号是否存在接口

# urls.py 如果不重写视图类不需要动
# views.py
class LoginView(ViewSet):
    @action(methods=['GET'], detail=False)
    def check_telephone(self,request,*args,**kwargs):
        import re
        telephone=request.query_params.get('telephone')
        if not re.match('^1[3-9][0-9]{9}',telephone):
            return APIResponse(code=0,msg='手机号不合法')
        try:
            models.User.objects.get(telephone=telephone)
            return APIResponse(code=1)
        except:
            return APIResponse(code=0,msg='手机号不存在')
View Code

 

腾讯云短信服务

#0 注册一个公众号()
-https://mp.weixin.qq.com/
-注册订阅号,一路下一步,申请个人
-截一个图(首页)
#1 腾讯云,---注册---实名:-https://console.cloud.tencent.com/smsv2
#2 https://console.cloud.tencent.com/smsv2/csms-sign/create
-把图传上去,认证
#3 创建模板(审核)
#4 应用管理(创建一个应用,记住appid和App Key)
#5 扣代码(https://cloud.tencent.com/document/product/382/11672)

 

# 7 帮助文档
-API:一堆web接口,基于API接口来写
-SDK:软件开发工具包软件,别人基于api接口,用不同语言封装的工具包,我们可以直接调用方法完成某些事

 

 

短信验证码接口

# lib/tx_sms
#__init__.py
from .send import  get_code,send_message
#send.py


from qcloudsms_py import SmsSingleSender
from luffyapi.utils.logger import log
from . import settings


# 生成一个四位随机验证码
def get_code():
    import random
    s_code=''
    for i in range(4):
        s_code+=str(random.randint(0,9))
    return s_code


def send_message(phone,code):

    ssender = SmsSingleSender(settings.appid, settings.appkey)
    params = [code, '3']  # 当模板没有参数时,`params = []`
    try:
        result = ssender.send_with_param(86, phone, settings.template_id, params, sign=settings.sms_sign, extend="", ext="")
        if result.get('result') == 0:
            return True
        else:
            return False
    except Exception as e:
        log.error('手机号:%s,短信发送失败,错误为:%s'%(phone,str(e)))

#settings.py

# 短信的配置
# 短信应用 SDK AppID
appid = 140039846  # SDK AppID 以1400开头
# 短信应用 SDK AppKey
appkey = "fd972f6da15add4de47b50b8dbe930"
# 短信模板ID,需要在短信控制台中申请
template_id = 66935  # NOTE: 这里的模板 ID`7839`只是示例,真实的模板 ID 需要在短信控制台中申请
# 签名
sms_sign = "小猿取经"  # NOTE: 签名参数使用的是`签名内容`,而不是`签名ID`。这里的签名"腾讯云"只是示例,真实的签名需要在短信控制台中申请



# views.py
    @action(methods=['GET'], detail=False)
    def send(self,request,*args,**kwargs):
        '''
        发送验证码接口
        :return:
        '''
        import re
        from luffyapi.libs.tx_sms import get_code,send_message
        from django.core.cache import cache
        from django.conf import settings
        telephone = request.query_params.get('telephone')
        if not re.match('^1[3-9][0-9]{9}', telephone):
            return APIResponse(code=0, msg='手机号不合法')
        code=get_code()
        result=send_message(telephone,code)
        # 验证码保存(保存到哪?)
        # sms_cache_%s
        cache.set(settings.PHONE_CACHE_KEY%telephone,code,180)
        if result:
            return APIResponse(code=1,msg='验证码发送成功')
        else:
            return APIResponse(code=0, msg='验证码发送失败')
View Code

 

标签:username,code,短信,get,验证码,接口,return,user,import
From: https://www.cnblogs.com/97zs/p/18008459

相关文章

  • C#接口(Interface)
    在C#语言中,类之间的继承关系仅支持单重继承,而接口是为了实现多重继承关系设计的。一个类能同时实现多个接口,还能在实现接口的同时再继承其他类,并且接口之间也可以继承。无论是表示类之间的继承还是类实现接口、接口之间的继承,都使用“:”来表示。接口定义了属性、方法和事件,这些......
  • 一文搞清楚Java中的包、类、接口
    写在开头包、类、接口、方法、变量、参数、代码块,这些都是构成Java程序的核心部分,即便最简单的一段代码里都至少要包含里面的三四个内容,这两天花点时间梳理了一下,理解又深刻了几分。Java中的包Java定义了一种名字空间,称之为包:package。一个类总是属于某个包,类名(比如Person)只是......
  • 数据量大导致接口请求超时
    问题场景某个接口因数据量过大导致请求超时,报错NetworkError。解决办法webpack默认2分钟后请求超时,更改vue.config.js配置如下://修改webpack默认2分钟的超时proxyTimeout:10*60*1000,onProxyReq:(proxyReq,req,res)=>req.setTime......
  • java 8 接口默认方法多继承
    已知:publicinterfaceA{defaultvoidfun(){System.out.println("A");}}publicinterfaceBextendsA{defaultvoidfun(){System.out.println("B");}}publicinterfaceC{defaultvoidfun(){......
  • 在Go中使用接口:实用性与脆弱性的平衡货币的精度
    在Go中使用接口:实用性与脆弱性的平衡原创 TimLiu 爱发白日梦的后端 2024-02-0307:00 发表于广东 听全文爱发白日梦的后端专注Go语言领域的发展,学习成为更牛逼的架构师,日常分享Go语言、架构、软件工具的使用。168篇原创内容公众号点击上方“名......
  • 忍不了,客户让我在一个接口里兼容多种业务逻辑
    这天,原本静谧而又和谐的办公室却被开放平台老六抱怨声打破了。“不改,别给我打电话了!说几遍都没用。这是一个研发的底线.....”分享是最有效的学习方式。博客:https://blog.ktdaddy.com/老猫的设计模式专栏已经偷偷发车了。不甘愿做crudboy?看了好几遍的设......
  • 优化拼多多关键词搜索接口:提高查询响应速度的技巧
    在电商平台中,关键词搜索接口是用户寻找商品的重要途径。一个高效、快速的搜索接口能够极大地提升用户的购物体验。针对拼多多这样的大型电商平台,优化搜索接口的查询响应速度尤为重要。本文将深入探讨如何通过多种方法来优化拼多多关键词搜索接口。1.使用缓存技术缓存是提升读取速......
  • 接口文档
    目录接口文档接口文档作用:描述接口的文章接口是什么呢?接口:使用AJAX和服务器通讯时,使用的URL,请求方法,以及参数一般来说接口文档是由后端工程师提供的黑马程序员案例城市列表图片黑马案例接口文档链接https://apifox.com/apidoc/project-1937884/api-49760215......
  • nodejs+axios调用第三方接口返回数据给前端
    nodejsaxios调用第三方接口返回数据给前端后端koalas前端vue0.内容和前后端框架本项目为前端执行时间段和航班,后端利用指定信息查询第三方航班信息接口并返回给前端。1.koajs+axiosapp.js文件中引入koa、添加初始化中间件并启动项目。1.1引入koa并添加初始化bodyPars......
  • 【C#】基础类、结构、抽象类、接口的相关概念
    先来简单说一下他们各自的含义是什么: 1.类(class):类类型是由字段数据(成员变量)和操作字段数据的成员(属性、方法、构造函数、事件等)所构成的自定义类型。其中字段数据表示类实例(对象)的状态。2.结构(struct):C#中结构类型和类类型在语法上非常相似,他们都是一种数据结构,都可以包括......