import random
import re
import jwt
import redis
from django.contrib.auth.hashers import check_password
from django.db.models import Q
from django.http import HttpResponse
from django.shortcuts import render
# Create your views here.
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler
from api.models import User
class CheckUsername(APIView):
def get(self,request,username):
#验证用户名是否重复
rule=r'^[a-zA-Z][a-zA-Z0-9]{5,15}$'
match_rs=re.findall(rule,username)
if not match_rs:
return Response({
"code": 400,
"msg": '用户名错误'
})
user_count=User.objects.filter(username=username).count()
if not user_count:
return Response({
"code":200,
"msg":'username',
})
else:
return Response({
"code":400,
"msg":'用户名存在'
})
class Checkmobile(APIView):
def get(self,request,mobile):
rule = r'1[3-9][0-9]{9}$'#
match_rs=re.findall(rule,mobile)
if not match_rs:
return Response({
"code": 400,
"msg": '手机号格式错误'
})
mobile_count=User.objects.filter(mobile=mobile).count
if not mobile_count:
return Response({
"code":400,
"msg":'手机号存在'
})
else:
return Response({
"code":200,
"msg":mobile
})
# 验证码生成
class ImageCode(APIView):
def get(self,request,uuid):
#生成四位随机字符
from captcha.image import ImageCaptcha
random_num=random.randint(1000,9999)
random_str = str(random_num)
#生成验证码
img = ImageCaptcha()
img_byte = img.generate(random_str)
#把验证码存入 redis数据库
r = redis.Redis(host="127.0.0.1")#连接数据
key = "code:"+uuid
r.set(key,random_str,ex=300)
return HttpResponse(img_byte,content_type='ing_ping')
class CheckimgCode(APIView):
def get(self, request):
uuid =request.query_params["imageCodeID"]
code =request.query_params["imageCode"]
r = redis.Redis(host="127.0.0.1") # 连接数据
key = "code:" + uuid
system_code =r.get(key)
system_code =str(system_code,encoding="utf-8")
print(system_code)
if system_code.upper()!=code.upper():
return Response({
"code":400,
"msg":'验证码错误'
})
return Response({
"code":200,
"msg":'验证码通过'
})
#注册
class Register(APIView):
def post(self, request):
# 前端传入 userName, pwd, mobile, agree
username = request.data.get("userName")
password = request.data.get("pwd")
mobile = request.data.get("mobile")
agree = request.data.get("agree")
#验证参数
if not all([username, password, mobile]):
return Response({"code":204, "msg":"注册信息不完整!"})
if not agree:
return Response({"code":204, 'msg':"未同意用户使用协议"})
# 存入数据库
User.objects.create_user(username=username, password=password, mobile=mobile)
# 返回响应
return Response({"code":200, "msg":"注册成功!"})
# 登录
class LoginView(APIView):
def post(self,request):
# 1.获取前端传来的用户名和密码
username = request.data.get("user")
password = request.data.get("pwd")
# 2.对前端传来的用户名和密码进行校验
try:
user = User.objects.get(Q(username=username) | Q(mobile=username))
# user = User.objects.get(username=username)
except User.DoesNotExist as e:
return Response({"msg":"此用户不存在,请先注册","code":400})
correct = check_password(password,user.password)
# 返回TRUE 说明用户名和密码匹配
if correct:
# 生成token,把生成的token返回
# 传入第二部分的用户信息
payload = jwt_payload_handler(user)
# 根据第二部分生成token
token = jwt_encode_handler(payload)
# 把token 写入cookie,便于退出
# 思考: cookie 是在响应中生成的还是在请求中生成的
resp = Response({"msg":"登录成功","code":200,'user':{"userName":user.username}})
# 设置cookie中
resp.set_cookie('token',token)
return Response({"msg":"登录成功","code":200,'user':{"userName":user.username}})
else:
return Response({"msg":"用户名密码错误","code":400})
class Logout(APIView):
"""退出登录"""
def post(self, request):
print(request)
# 删除cookie
token = request.COOKIES.get('token')
if token:
del token
return Response({'msg':"退出成功!", "code": 200})