飞行的猪哼哼

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

dockers登录小总结:

docker container start tracker
docker container start storage
docker container start elasticsearch
docker container ls

一:浏览历史记录:

0:先配置redis数据库配置:

"history": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://192.168.203.153:6379/3",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
            }
        },

1:添加用户浏览历史
1.1:编辑apps/users/views.py

from apps.goods.models import SKU
from django_redis import get_redis_connection
# 用户浏览历史记录
class UserBrowseHistory(LoginRequiredJSONMixin, View):

    def post(self, request):

        user = request.user
        # 1、提取参数
        # 2、校验参数
        data = json.loads(request.body.decode())
        sku_id = data.get('sku_id')
        if not sku_id:
            return JsonResponse({
                'code': 400,
                'errmsg': '缺少参数'
            }, status=400)

        try:
            SKU.objects.get(pk=sku_id, is_launched=True)
        except SKU.DoesNotExist as e:
            return JsonResponse({
                'code': 404,
                'errmsg': '商品已下架/不存在'
            }, status=404)

        # 3、数据/业务处理 —— 把访问的sku的id写入redis表示记录一条浏览历史
        
        # 3.1、获取"history"缓存配置的redis链接
        conn = get_redis_connection('history')
        p = conn.pipeline()
        # 3.2、历史记录写入缓存
        # 3.2.1、去重
        p.lrem(
            'history_%d' % user.id,
            0, # 删除所有指定成员
            sku_id
        )
        # 3.2.2、插入列表头
        p.lpush(
            'history_%d' % user.id,
            sku_id
        )
        # 3.2.3、截断保留5个记录
        p.ltrim(
            'history_%d' % user.id,
            0,
            4
        )
        p.execute() # 批量执行redis指令

        # 4、构建响应
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok'
        })

1.2:编辑apps/users/views.py实现视图

from apps.goods.models import SKU
from django_redis import get_redis_connection
# 用户浏览历史记录
class UserBrowseHistory(LoginRequiredJSONMixin, View):
  	# .....
    
    # 查看历史
    def get(self, request):

        user = request.user
        # 1、提取参数
        # 2、校验参数
        # 3、数据/业务处理 —— 用户浏览的sku商品信息返回(读redis获取最近浏览的历史sku.id, 读mysql获取sku详细信息)
        # 3.1、读redis获取浏览历史
        conn = get_redis_connection('history')
        # sku_ids = [b'6', b'3', b'4', b'14', b'15']
        sku_ids = conn.lrange(
            'history_%d' % user.id,
            0,
            -1
        )

        skus = [] # 用于记录返回sku商品的详细信息
        # 3.2、读mysql获取详细信息
        for sku_id in sku_ids:
            # sku_id = b'6'
            sku = SKU.objects.get(pk=int(sku_id))
            skus.append({
                'id': sku.id,
                'name': sku.name,
                'default_image_url': sku.default_image.url,
                'price': sku.price
            })

        # 4、构建响应
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'skus': skus
        })

1.3:编辑apps/users/urls.py映射路由

urlpatterns = [
		# ......
    # 记录/访问历史
    re_path(r'^browse_histories/$', views.UserBrowseHistory.as_view()),
]

二:使用pickle和base64模块

pickle模块: 把python的一个对象,编码成一个字节。
base64模块: 把三个字节,编码成一个可视化的字符。
1:进行pickle和base64加解密测试:

import pickle, base64


def main():
    #  定义一个字典套字典的数据
    cookie_cart = {
        1: {
            "count": 5,
            "selected": True
        },
        2: {
            "count": 15,
            "selected": False
        }
    }

    # 1:编码测试:字典数据--->字节数据 ---> 字节类型字符串数据--->encode变成前端可以看见的字符串。
    cart_bytes = pickle.dumps(cookie_cart)
    print("cart_bytes:", cart_bytes)
    # : cart_bytes: b'\x80\x03}q\x00(K\x01}q\x01(X\x05\x00\x00\x00countq\x02K\x05X\x08\x00\x00\x00selectedq\x03\x88uK\x02}q\x04(h\x02K\x0fh\x03\x89uu.'
    cart_string = base64.b64encode(cart_bytes)
    print("cart_string:", cart_string)
    # :cart_string: b'gAN9cQAoSwF9cQEoWAUAAABjb3VudHECSwVYCAAAAHNlbGVjdGVkcQOIdUsCfXEEKGgCSw9oA4l1dS4='


    # 2:解码测试   变成前端可以看见的字符串decode--->字节类型字符串数据--->字节类型--->字典数据

    cart_bytes = base64.b64decode(cart_string)
    print("使用base64解码后的数据:", cart_bytes)
    # 使用base64解码后的数据: b'\x80\x03}q\x00(K\x01}q\x01(X\x05\x00\x00\x00countq\x02K\x05X\x08\x00\x00\x00selectedq\x03\x88uK\x02}q\x04(h\x02K\x0fh\x03\x89uu.'

    cart_dict = pickle.loads(cart_bytes)
    print("使用loads解码后的数据:", cart_dict)
    #使用loads解码后的数据: {1: {'count': 5, 'selected': True}, 2: {'count': 15, 'selected': False}}

if __name__ == '__main__':
    main()

2:封装cookie购物数据编解码接口:
新建并编辑meiduo_mall/utils/cookiesecret.py封装cookie购物车数据的编解码接口




import pickle, base64

class CookieSecret(object):

    # 自定义编码方法
    @staticmethod
    def dump(data):
        """请传入一个字典数据,返回一个字节类型的字符串数据"""
        # 将字典数据编码字节类型数据
        data_bytes = pickle.dumps(data)

        #将字节类型数据编码成字节类型的字符串数据
        data_string = base64.b64encode(data_bytes)

        return data_string.decode()


    @staticmethod
    def loads(data):
        """请传入一个字节类型字符串的数据,返回一个字典类型数据"""
        # 将可视化字节类型数据转换成真正的字节类型数据
        data_bytes = base64.b64decode(data)

        # 将字节类型数据转换成对象类型
        data_dict = pickle.loads(data_bytes)

        return data_dict

        

三:购物车模块:

1:数据库存储设计:

1.1
存储的主体数据是SKU商品;
用户登陆的时候,把购物车数据存入Redis中!
用户未登陆的时候,把购物车数据存入Cookie中!

1.2:用户登陆redis购物车存储设计 —— redis
具体存储的购物车数据有哪些?
答:需要把sku.idsku商品数量勾选状态存入redis里面!

1.3:选择redis类型:

# 记录购物车中的sku商品和其数量
# 采用哈希对象存储sku的id和其count数量
# 格式为 --  carts_<用户id> : {"1": "5", "2": "10"}
# 1、把一个sku商品及其数量添加购物车
hincrby carts_1 1 5
# 2、从购物车中获取sku商品及其数量
hgetall carts_1

# 记录sku商品的勾选状态
# 我们采用redis集合的方式来存储,sku.id在一个集合中表示该sku商品是被选中的
# 1、把一个sku商品选中
sadd selected_1 2
# 2、把一个sku商品取消勾选
srem selected_1 2
# 3、查看当前id为1用户选中的所有的sku商品
smembers selected_1

1.4:用户未登陆购物存储设计 —— cookie
存储哪些数据?
答: 需要把sku.idsku商品数量勾选状态存入cookie中!
我们自己设计一个json格式的数据记录cookie购物车数据:

{
    "sku_id1": {
        "count":"1",
        "selected": True
    },
    "sku_id3":{
        "count":"3",
        "selected": True
    },
    "sku_id5":{
        "count":"3",
        "selected": False
    }
}

cookie是明文的,且长度有限制,怎么解决?!
答:使用pickle和base64模块进行加解密。

2:准备工作:

2.1:新建carts应用

cd meiduo_mall/apps
python3 ../manage.py startapp carts

2.2:设置总路由和子路由:
编辑dev.py

INSTALLED_APPS = [
    # ......
    'apps.carts'
]

编辑meiduo_mall/urls.py

urlpatterns = [
    # ......
    re_path(r'', include('apps.carts.urls')),
]

2.3:配置购物车专用缓存:

"carts": {
    	"BACKEND": "django_redis.cache.RedisCache",
    	"LOCATION": "redis://192.168.203.153:6379/4",
    	"OPTIONS": {
    	    "CLIENT_CLASS": "django_redis.client.DefaultClient",
    	}
	},
posted on 2020-09-10 17:59  飞行的猪哼哼  阅读(24)  评论(0)    收藏  举报