用户认证—历史记录与收藏

本文探讨了用户认证过程,包括JWT_token中的身份验证,并介绍了如何通过自定义中间件来确保安全操作。此外,还详细讲解了收藏功能的实现,如收藏模型的设计,涉及收藏表与商品和用户的外键关联,以及相关的API设计和类试图。
摘要由CSDN通过智能技术生成

用户认证

JWT_token 中的载体payload:

payload = {    
    'id': user.id,    
    'username': user.username,    
    'mobile': user.mobile    
    # 'exp': datetime.datetime.now() + datetime.timedelta(seconds=300)
}

身份认证,有一些功能(加入购物车)必须是用户登录成功以后才能操作。

自定义中间件
在根目录创建middleware
创建middleware.py文件

from django.utils.deprecation import MiddlewareMixin
import jwt
from day2 import settings
# 自定义中间件
class CheckUserMiddleware(MiddlewareMixin):
    def process_request(self,request):
        # 注意:以后需要的身份认证的请求,都将身份认证信息(jwt)添加到请求头中
        # 请求头的解析方式
        # 1.提取请求头中的token
        token=request.headers.get('token')
        # 2.判断token 是否存在
        # 给request增加一个字段user_info,保存用户信息
        if not token:
            request.user_info=None
        else:
            # 3.token存在,解析token中的内容
            payload=jwt.decode(token,key=settings.SECRET_KEY,algorithms='HS256')
            # 4.保存解析的用户信息
            request.user_info=payload

API设计

功能添加历史记录
请求方式POST
请求地址/goods/oneGood/history/
POST参数productID: 商品id
headers参数token:jwt信息
成功响应{‘msg’:‘添加历史记录成功!’,‘code’:200}
失败响应{‘msg’:‘添加历史记录失败!’,‘code’:204}
from user.models import User
import redis
class History(APIView):
    def post(self,request):
        try:
            # 1.判断用户是否登录
            user=User.objects.get(id=request.user_info.get('id'))
        except Exception as e:
            print(e)
            return Response({'msg':'用户不存在或未登录','code':'204'})
        # 2.获取商品id
        good_id = request.data.get('productID')
        # 3.判断商品是否存在
        try:
            good_data = Goods.objects.get(id=good_id)
        except Exception as e:
            print(e)
            return Response({'msg': '此商品不存在', 'code': 204})
            # 4.添加历史记录 history_用户名:[1,7,2,3]
        history_key = f'history_{user.username}'
        r = redis.Redis(host='localhost', port=6379, db=0)
        r.lrem(history_key, 0, good_id)
        r.lpush(history_key, good_id)
        r.ltrim(history_key, 0, 4)
        r.close()
        return Response({'msg': '历史记录添加成功', 'code': 200})

收藏

模型类

收藏表字段:id 商品(外键) 用户(外键)

from user.models import User
class GoodsCollect(models.Model):
    user=models.ForeignKey(User,on_delete=models.CASCADE,verbose_name='用户')
    goods=models.ForeignKey(Goods,on_delete=models.CASCADE,verbose_name='商品')
    class Meta:
        verbose_name_plural='收藏表'
        db_table='good_collect'
    def __str__(self):
        return f'{self.user.username}:{self.goods.sku_name}'

API设计

功能添加收藏
请求方式POST
请求地址/goods/user/collection/
POST参数productID: 商品id
headers参数token:jwt信息
成功响应{‘msg’:‘收藏成功!’,‘code’:200}
失败响应{‘msg’:‘添加收藏失败!’,‘code’:204}

类试图

class Collection(APIView):
    def post(self,request):
        try:
            # 1.判断用户是否登录
            user=User.objects.get(id=request.user_info.get('id'))
        except Exception as e:
            print(e)
            return Response({'msg':'用户不存在或未登录','code':204})
         # 2.判断收藏是否存在
        good_id = request.data.get('productID')
        collect_data=GoodsCollect.objects.filter(user=user,goods_id=good_id)
        if collect_data.count()>0:
            return Response({'msg':'收藏已存在','code':204})
        #3.收藏不存在,添加收藏
        try:
            GoodsCollect.objects.create(user=user,goods_id=good_id)
        except Exception as e:
            print(e)
            return Response({'msg': '添加收藏失败', 'code': 204})
        return Response({'msg': '添加收藏成功', 'code': 200})

API设计

功能查看收藏
请求方式POST
请求地址/goods/user/collection/
headers参数token:jwt信息
成功响应{‘code’:200,
‘collectList’:[

{
“id”:i.good.id,
“sku_name”:i.good.sku_name,
“title”:i.good.title,
“price”:i.good.price,
“selling_price”:i.good.selling_price,
“img”:i.good.img,
}
,…
]}
失败响应{‘msg’:‘添加收藏失败!’,‘code’:204}
   def get(self,request):
        try:
            # 1.判断用户是否登录
            user = User.objects.get(id=request.user_info.get('id'))
        except Exception as e:
            print(e)
            return Response({'msg': '用户不存在或未登录', 'code': 204})
        collect_data=GoodsCollect.objects.filter(user=user)
        if collect_data.count()==0:
            return Response({'msg': '用户没有任何收藏', 'code': 204})
        #3.处理收藏的数据
        collect_list = []
        for i in collect_data:
            collect_list.append({
                'id':i.goods.id,
                'sku_name': i.goods.sku_name,
                'title': i.goods.title,
                'price': i.goods.price,
                'selling_price': i.goods.selling_price,
                'img': i.goods.img,
            })
        #4.返回结果
        return Response({'collectList': collect_list, 'code': 200})

API设计

功能删除收藏
请求方式DELETE
请求地址/goods/user/collection/
headers参数token:jwt信息
成功响应{‘code’:200,
‘msg’:‘删除收藏成功’}
失败响应{‘msg’:‘删除收藏失败!’,‘code’:204}
    def delete(self,request):
        try:
            # 1.判断用户是否登录
            user = User.objects.get(id=request.user_info.get('id'))
        except Exception as e:
            print(e)
            return Response({'msg': '用户不存在或未登录', 'code': 204})
        # 2.根据商品id 删除收藏
        good_id = request.data.get('productID')
        try:
            GoodsCollect.objects.get(user=user,goods_id=good_id).delete()
        except Exception as e:
            print(e)
            return Response({'msg': '删除收藏失败', 'code': 204})
        return Response({'msg': '删除收藏成功', 'code': 200})

路由

from django.urls import path,include
from . import views
urlpatterns = [
    path('oneGood/history/', views.History.as_view()),
    path('user/collection/', views.Collection.as_view()),
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值