多种登陆方式接口
# 路由 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