zoukankan      html  css  js  c++  java
  • 购物车存储方案

    一条完整的购物车记录包括:用户、商品、数量、勾选状态

    登陆用户存储类型说明

    • 用户、商品、数量:hash
    carts_user_id: {sku_id1: count, sku_id3: count, sku_id5: count, ...}
    
    • 勾选状态:set
    selected_user_id: [sku_id1, sku_id3, ...]
    

    未登陆用户

    • 由于用户未登录,服务端无法拿到用户的ID,所以服务端在生成购物车记录时很难唯一标识该记录,
      我们可以将未登录用户的购物车数据缓存到用户浏览器的cookie中
    • JSON 字符串可以描述复杂结构的字符串数据,可以保证一条购物车记录不用分开存储
    {
        "sku_id1":{
            "count":"1",
            "selected":"True"
        },
        "sku_id3":{
            "count":"3",
            "selected":"True"
        },
        "sku_id5":{
            "count":"3",
            "selected":"False"
        }
    }
    

    提示:
    浏览器 cookie 中存储的是字符串明文数据。
    我们需要对购物车这类隐私数据进行密文存储。
    解决方案:pickle 模块 和 base64 模块

    pickle 模块的使用

    pickle 模块是 python 的标准模块
    提供了对于 python 数据的序列化操作,可以将数据转换为 bytes 类型

    pickle 模块提供了两个方法:

    pickle.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'x80x03}qx00(Xx01x00x00x001qx01}qx02(Xx05x00x00x00countqx03K
    Xx08x00x00x00selectedqx04x88uXx01x00x00x002qx05}qx06(hx03Kx14hx04x89uu.'
    >>> pickle.loads(s)
    {'1': {'count': 10, 'selected': True}, '2': {'count': 20, 'selected': False}}
    

    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.b64deocde( )

    • 将 base64 编码的 bytes 类型进行解码,返回解码后的 bytes 类型
    >>> import base64
    >>> s
    b'x80x03}qx00(Xx01x00x00x001qx01}qx02(Xx05x00x00x00countqx03K
    Xx08x00x00x00selectedqx04x88uXx01x00x00x002qx05}qx06(hx03Kx14hx04x89uu.'
    >>> b = base64.b64encode(s)
    >>> b
    b'gAN9cQAoWAEAAAAxcQF9cQIoWAUAAABjb3VudHEDSwpYCAAAAHNlbGVjdGVkcQSIdVgBAAAAMnEFfXEGKGgDSxRoBIl1dS4='
    >>> base64.b64decode(b)
    b'x80x03}qx00(Xx01x00x00x001qx01}qx02(Xx05x00x00x00countqx03K
    Xx08x00x00x00selectedqx04x88uXx01x00x00x002qx05}qx06(hx03Kx14hx04x89uu.'
    

    例如:

    # 导入
    import pickle
    import base64
    
    if __name__ == '__main__':
        # 定义一个字典:
        cart_dict = {
            1: {
                'count':2,
                'selected':True
            },
            3: {
               'count':3,
                'selected':False
            }
        }
    
        # 将字典转为 二进制类型
        result_bytes =  pickle.dumps(cart_dict)
        print(result_bytes)
        print(type(result_bytes))
        print('---'*16)
    
        # 将 16进制 表示的二进制类型 编码为 base64格式
        result_base64 = base64.b64encode(result_bytes)
        print(result_base64)
        print(type(result_base64))
        print('---'*16)
    
        # 将 base64格式 解码得到 字符串( str )
        result = result_base64.decode()
        print(result)
        print(type(result))
        print('---'*16)
    
        # 我们一般使用的时候, 会连着使用:
        result2 = base64.b64encode(pickle.dumps(cart_dict)).decode()
        print(result2)
        print('---'*16)
    
        # 如果想要返回去, 得到最初的 字典类型数据, 又该怎么做呢?
        result3 = pickle.loads(base64.b64decode(result2))
        print(result3)
    

    结果:

    b'x80x03}qx00(Kx01}qx01(Xx05x00x00x00countqx02Kx02Xx08x00x00x00selectedqx03x88uKx03}qx04(hx02Kx03hx03x89uu.'
    <class 'bytes'>
    ------------------------------------------------
    b'gAN9cQAoSwF9cQEoWAUAAABjb3VudHECSwJYCAAAAHNlbGVjdGVkcQOIdUsDfXEEKGgCSwNoA4l1dS4='
    <class 'bytes'>
    ------------------------------------------------
    gAN9cQAoSwF9cQEoWAUAAABjb3VudHECSwJYCAAAAHNlbGVjdGVkcQOIdUsDfXEEKGgCSwNoA4l1dS4=
    <class 'str'>
    ------------------------------------------------
    gAN9cQAoSwF9cQEoWAUAAABjb3VudHECSwJYCAAAAHNlbGVjdGVkcQOIdUsDfXEEKGgCSwNoA4l1dS4=
    ------------------------------------------------
    {1: {'count': 2, 'selected': True}, 3: {'count': 3, 'selected': False}}
    

    补充:
    base64.b64encode( byte字节流 ):
    将 byte 字节流进行 base64 编码, 返回编码之后内容( bytes字节流 )
    base64.b64decode( bytes字节流&str ):
    将参数进行 base64 解码, 返回解码之后内容( bytes字节流 )

  • 相关阅读:
    hdu1151 二分图(无回路有向图)的最小路径覆盖 Air Raid
    二分图多重匹配问题
    二分图最大匹配问题及其扩展
    ZOJ3741 状压DP Eternal Reality
    POJ2699:The Maximum Number of Strong Kings(枚举+贪心+最大流)
    POJ2396:Budget(带下界的网络流)
    POJ2391:Ombrophobic Bovines(最大流+Floyd+二分)
    POJ1637:Sightseeing tour(混合图的欧拉回路)
    URAL1277 Cops and Thieves(最小割)
    Leetcode 44. Wildcard Matching
  • 原文地址:https://www.cnblogs.com/oklizz/p/11234158.html
Copyright © 2011-2022 走看看