class LoginAPIView(APIView):
def post(self,request):
# 接收前端的数据
username=request.data.get("name")
password=request.data.get("pass")
print(",,,,",username,password)
# 2.验证用户是否存在
user=User.objects.filter(models.Q(username=username)|models.Q(mobile=username)).first()
print("查询集都有那些方法",dir(user))
if not user:
return Response({
"code":400,
"msg":"用户名或密码错误"
})
# 3.验证用户名密码是否正确
if password==user.password:
# 会话保持 使用jwt做会话保持
token=self.gen_token(user)
return Response({
"code":200,
"msg":"登录成功",
"username":user.username,
"token":token
})
return Response({
"code":400,
"msg":"用户名或密码错误"
})
@staticmethod
def gen_token(user):
"""
:param user: 用户对象
:return: jwt token
"""
# 组织pay.load数据
payload ={
"uid":user.id,
"username":user.username,
"exp":time.time() + 7*24*3600
}
# 编码生成token
token=jwt.encode(payload,settings.SECRET_KEY,algorithm="HS256")
return token
import jwt
from django.conf import settings
from rest_framework.response import Response
from myapp.models import User
# 登录的校验函数(高阶函数)
def check_login(func):
def wrapper(self,request,*args,**kwargs):
# 校验用户有没有登录
# 从请求头中获取token
token = request.headers.get("Authorization")
# 解码token 获取用户的信息 ******待优化
try:
payload = jwt.decode(token ,key=settings.SECRET_KEY ,algorithms=["HS256"])
except Exception as e:
print("解码token错误" ,e.args)
return Response({
"code" :401,
"msg" :"用户未认证"
})
# 3.获取用户的信息,并添加收藏
print("解码出的用户信息" ,payload)
request.uid = payload.get("uid")
request.user = User.objects.filter(id=request.uid).first()
# 4.执行真正的视图类的函数,及装饰的函数
return func(self,request,*args,**kwargs)
return wrapper
编辑json数据
def org_json(queryset):
"""
:param queryset: 查询集
:return: 字典列表
"""
temp = []
for i in queryset:
temp_dict={
"id":i.id,
"sku_name":i.sku_name,
"price":i.price,
"selling_price":i.selling_price,
"img":i.img,
"title":i.title,
"instruction":i.instruction,
"count":i.count,
"stock":i.stock,
"cate":i.cate.id,
"online":i.online
}
temp.append(temp_dict)
return temp
验证码视图
# 图片验证码的视图
class ImageCodeAPIView(APIView):
def get(self,request,uuid):
# 生成一个随机码
code ="".join(random.sample(string.ascii_letters +string.digits,4))
# 实例化一个图片验证码的对象
img=ImageCaptcha()
# 字节 io对象
imgage_code =img.generate(code)
# 验证码存入redis
redis_conn=redis.Redis(host="localhost",port=6379)
redis_conn.set(uuid,code,ex=5*60)
# 返回响应
return HttpResponse(imgage_code,content_type="image/png")
def post(self,request,uuid):
# 获取前端输入的验证码
image_code=request.data.get("imageCode")
#与redis中 对比验证码
redis_conn=redis.Redis(host="localhost",port=6379)
# 取出
stored_code=redis_conn.get(uuid)
# 验证码已过期
if not stored_code:
return Response({
"code":400,
"msg":"验证码已过期"
})
# 验证码还未过期,解码与前端对比
if stored_code.decode().lower() == image_code.lower():
return Response({
"code":200,
"msg":"验证成功"
})
return Response({
"code":400,
"msg":"验证码错误"
})