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

 

多种登陆方式接口

# 路由
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

 

 

 

 

 

posted @ 2024-02-05 16:57  朱饱饱  阅读(57)  评论(0)    收藏  举报