登录/注册,同步验证码,异步验证码
from django.shortcuts import render
# Create your views here.
from rest_framework.views import APIView
from rest_framework.response import Response
from users.models import UserModel
from users.serializers import UserModelSet
from django.contrib.auth.hashers import check_password,make_password
from rest_framework_jwt.utils import jwt_encode_handler
from django.utils import timezone
import time
# 加密解密:
# 发送验证码:
# from users.utils import send_message
from celery_tasks.sms_code.tasks import send_message
import random
import json
# 加密token:
# from shangcheng import settings
# import jwt
#
# def ja_token(user):
# pal = {
# 'user':user.username
# }
# token = jwt.encode(payload=pal,key=settings.SECRET_KEY,algorithm='HS256')
# return token
class UserView(APIView):
def post(self,request):
# # 获取前端的数据:
# username = request.data.get('username')
# password = request.data.get('password')
# mobile = request.data.get('phone')
#
# # 判断用户是否存在:
# try:
# user = UserModel.objects.get(username=username)
# # 如果存就是第二次登录,判断密码是否正确
# if check_password(password,user.password):
# # 进行他token加密:
# pal= {
# 'username':user.username
# }
# # 进行加密:
# token = jwt_encode_handler(pal)
# return Response({'msg':'登录成功','code':200,'data':token,'user':username})
# else:
# return Response({'msg':'登录失败!','code':404})
# except Exception as e:
# print(e)
# # 将数据添加到数据库中:
# # 给密码加密
# pwd = make_password(password)
# user = UserModel.objects.create(
# username=username,
# password=pwd,
# mobile=mobile,
# )
# pal = {
# 'username': user.username,
# }
# # 进行加密:
# token = jwt_encode_handler(pal)
# return Response({'msg':'登录成功','code':200,'data':token,'user':user.username})
# 1.获取前端传递的数据:
username = request.data.get('username')
password = request.data.get('password')
mobile = request.data.get('phone')
# print(mobile)
# 获取验证码:
smsCode = request.data.get('smsCode')
# 连接数据库:
r = redis.Redis(host='localhost',port=6379,db=5)
# 获取出来:
roal_msm_code=r.get('code_%s' %mobile)
# 判断验证码:
if not roal_msm_code:
return Response({'msg':'短信验证码过期!','code':404})
if roal_msm_code.decode() != smsCode:
return Response({'msg':'验证验证码失败!','code':404})
# 判断数据是否齐全:
if not all([username,password,mobile]):
return Response({'msg':'数据不齐全!','code':404})
# 判断用户是否存在:
try:
user=UserModel.objects.get(username=username)
# 判断密码是否正确:
print(">>>我是第二次")
# print(user)
# 生成token
pal = {
'user':user.username
}
token = jwt_encode_handler(pal)
print(token)
if check_password(password, user.password):
user.last_login = timezone.now()
user.save()
return Response({'msg': '登录成功', 'code': 200,
'data':{
'user': user.username,
'token': token,
}})
except Exception as e:
print(e)
ja_pwd = make_password(password)
user=UserModel.objects.create(
username=username,
password=ja_pwd,
phone=mobile,
)
print(mobile)
# 注册时,是日增
# 获取出注册时的时间:
pal = {
'user': user.username
}
token = jwt_encode_handler(pal)
return Response({'msg':'注册并登录成功','code':200,
'data': {
'user': user.username,
'token': token,
}})
return Response({'msg':'ok','code':200})
# 退出:
class TuiView(APIView):
def get(self,request):
# 获取前端传递过来的数据:
# username = request.query_params.get('username')
# # 找到后端数据:
# try:
# UserModel.objects.get(username=username).delete()
# except Exception as e:
# print(e)
# return Response({'msg':'退出失败!','code':404})
return Response({'msg':'退出成功','code':200})
import redis
class SendMSCode(APIView):
def get(self,request):
# 获取前端手机号:
mobile = request.query_params.get('mobile')
# print(mobile)
# 生成验证码:
code = random.randint(000000,999999)
# 判断手机号是否获取到:
if mobile:
# 传递形参:
resp = send_message.delay(mobile,code)
if resp:
r = redis.Redis(host='localhost', port=6379, db=5)
r.setex('code_%s' % mobile, 600, code)
r.close()
return Response({'msg': '发送验证码成功', 'code': 200, 'wer': code})
else:
return Response({'msg':'发送验证码失败!','code':404})
# 将标识获取到判断是否是发送成功:
# to_biao = json.loads(resp)['statusCode']
# if to_biao == '000000' or to_biao == '112310':
# 将验证码添加到redis数据库中,便于下次认证:
# r = redis.Redis(host='localhost',port=6379,db=5)
# r.setex('code_%s'%mobile,600,code)
# r.close()
# return Response({'msg':'发送验证码成功','code':200,'wer':code})
# else:
# return Response({'msg':'发送验证码失败!','code':404})
import os
from celery import Celery
from django.conf import settings
# 关联celery和django项目,需要加载django的配置文件
os.environ.setdefault('DJANGO_SETTINGS_MODULE','shangcheng.settings')
app = Celery('mycelery')
app.config_from_object('celery_tasks.config')
# 自动发现整个项目中所有的任务:
app.autodiscover_tasks(settings.INSTALLED_APPS)
# 消息队列:存放的是等待执行的任务
broker_url = 'redis://127.0.0.1:6379/15'
# 存放结果:异步发送短信验证码。
result_backend = 'redis://127.0.0.1:6379/14'
from ronglian_sms_sdk import SmsSDK
import random
from celery_tasks.main import app
accId = '8a216da881ad975401821a381f861a19'
accToken = '96260c8b93e54ec188b4a3522283038f'
appId = '8a216da881ad975401821a3820631a20'
@app.task(name="sms_code")
def send_message(mobile,code):
sdk = SmsSDK(accId, accToken, appId)
tid = '1'
# 验证码:
# code = random.randint(000000,999999)
datas = (code,)
resp = sdk.sendMessage(tid, mobile, datas)
# print(resp)
return resp