python学习之美多商城(二十):购物车部分:购物车数据存储设计、pickle模块与base64模块

一、Redis保存已登录用户:

python学习之美多商城(二十):购物车部分:购物车数据存储设计、pickle模块与base64模块
说明:

  • 因为每个童虎要保存多个商品的sku_id与其对应的数量, 所以选择Reids的哈希类型来保存。
  • 对于购物车勾选的保存,只需保存勾选状态,所以可以保存勾选了的商品sku_id(此处未保存的那些在哈希数据中的商品就是未勾选的商品),对于商品的勾选需要去重,但不需要保存商品的加入顺序,所以可以选择Redis的Set类型来保存数据。

在配置文件中增加保存购物车的Redis配置:

# meiduo_mall/settings/dev.py
...
CACHES = {
    ...
    "cart": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://10.211.55.5:6379/4",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}
...

二、Cookie保存未登录用户:

{
    sku_id: {
        "count": xxx,  // 数量
        "selected": True  // 是否勾选
    },
    sku_id: {
        "count": xxx,
        "selected": False
    },
    ...
}

早cookie中只能保存字符串数据, 所以将上述数据使用pickle进行序列换转换, 并使用base64编码为字符串,保存到cookie中。

三、pickle模块与base64模块

1. pickle模块的使用:

pickle模块是python的标准模块,提供了对于python数据的序列化操作, 可以将数据转换为bytes类型,其序列化速度比json模块要高。

  • pick.dumps() 将python数据序列化为bytes类型;
  • pickle.loads() 将bytes类型数据反序列化为python的数据类型;
>>> import pickle
>>> d = {'1': {'count': 10, 'selected': True}, '2': {'count': 20, 'selected': False}}
>>> s = pickle.dumps(d)
>>> s
b'\x80\x03}q\x00(X\x01\x00\x00\x001q\x01}q\x02(X\x05\x00\x00\x00countq\x03K\nX\x08\x00\x00\x00selectedq\x04\x88uX\x01\x00\x00\x002q\x05}q\x06(h\x03K\x14h\x04\x89uu.'
>>> pickle.loads(s)
{'1': {'count': 10, 'selected': True}, '2': {'count': 20, 'selected': False}}

2.base64模块的使用:

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2^6=64,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。

Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括MIME的电子邮件及XML的一些复杂数据。

python标准库中提供了base64模块,用来进行转换。

  • base64.b64encode() 将bytes类型数据进行base64编码, 返回编码后的bytes类型
  • base64.b64decode() 将base64编码的bytes类型进行解码,返回解码后的bytes类型
>>> import base64
>>> s
b'\x80\x03}q\x00(X\x01\x00\x00\x001q\x01}q\x02(X\x05\x00\x00\x00countq\x03K\nX\x08\x00\x00\x00selectedq\x04\x88uX\x01\x00\x00\x002q\x05}q\x06(h\x03K\x14h\x04\x89uu.'
>>> b = base64.b64encode(s)
>>> b
b'gAN9cQAoWAEAAAAxcQF9cQIoWAUAAABjb3VudHEDSwpYCAAAAHNlbGVjdGVkcQSIdVgBAAAAMnEFfXEGKGgDSxRoBIl1dS4='
>>> base64.b64decode(b)
b'\x80\x03}q\x00(X\x01\x00\x00\x001q\x01}q\x02(X\x05\x00\x00\x00countq\x03K\nX\x08\x00\x00\x00selectedq\x04\x88uX\x01\x00\x00\x002q\x05}q\x06(h\x03K\x14h\x04\x89uu.'