实战项目-美多商城(六)购物车

发布时间 2023-04-07 17:03:08作者: 清安宁

购物车应该存储那些数据

  • sku_id(商品ID)
  • count(购买数量)
  • selected(是否被勾选)
- 登录用户: 允许使用服务器资源

    - 存储到 redis,每条数据分两种格式存储(为了演示,所以这么搞)

        - Set:{sku_id_1,sku_id_2......} # 有放入集合(自带去重功能),就表示已勾选
        - Hash:dict {sku_id_1:count,sku_id_2:count......}
        
        - 如果是效率搞,可以这么设计,为每个用户创建一个hash: cart_user_id
        	- 里面存储 {sku_id:sku_id,count:xxx,selected:true}

- 未登录用户: 不允许使用服务器资源

    - 存储到 浏览器cookie(存到 localStorage也可以...,为了演示cookie的使用,所以这么搞)

    - cookie中只能存储'键值对',key-value都是必须是str类型

        - response.set_cookie('cart','value','过期时间')

        - 类似的数据格式:

            {
                sku_id_1:{'count':1,'selected':true},
                sku_id_2:{'count':1,'selected':true}
            }

pickle模块(比json模块高效)和base64模块(简单加密/解密)---简单使用

  • pickle模块(将数据在strbytes之间转换): 提供了对于 python 数据的序列化操作,可以将数据转换为 bytes 类型
    • pickle.dumps(): 将 python 数据序列化为 bytes 类型
    • pickle.loads(): 将 bytes 类型数据反序列化为 python 的数据类型( 字典, 对象等 )
import pickle

data = {'1': {'count': 10, 'selected': True}, '2': {'count': 20, 'selected': False}}
bytes_data = pickle.dumps(data)
print(bytes_data) # b'\x80\x03}q\x00(X\x01\x00\x00\x001q\x01}q\x02(X\x05\x00......
dict_data = pickle.loads(bytes_data)
print(dict_data) # {'1': {'count': 10, 'selected': True}, '2': {'count': 20, 'selected': False}}

如果使用str.encode()或者bytes.decode()太过于直观...

  • base64模块:把bytes类型数据,作进一步'加密'/'解密'处理
import base64

bytes_data = b'king'
encode_bytes_data = base64.b64encode(bytes_data)
print(encode_bytes_data) # b'a2luZw=='
decode_bytes_data = base64.b64decode(encode_bytes_data)
print(decode_bytes_data) # b'king'