如何以python风格高逼格的改成购物车逻辑
之前有一篇博文写到关于购物车的业务逻辑,分别运用cookie和redis存储未登录和登录用户的购物车数据,虽然已经很好的完成了业务逻辑,但是会发现代码的冗余很严重,也不够具有python特色,今天就让我来用python特色,高逼格的来改写一下购物车逻辑把。
回看之前代码,我们会发现,会经常取出购物车数据,然后也会修改数据,我们能否对读和写的操作进行封装,第二,cookie中和redis中存储的我们对数据存储的格式不一样,能否考虑将两者存储为一种格式,第三,考虑数据通过网络传输,我们能否尽量存储少的数据。
之前我们在redis中是将商品数量和商品勾选状态分别存为hash和set,而在cookie中则是存成一个大字典,然后将大字典转化为字符串,在redis中,我们也可以采用相同的存储方式,而相对于字典中嵌套字典,我们的小字典中只有两组数据,我们可以用一个列表直接存储商品数量和勾选状态,记住对应的下标即可,这样我们就不用花空间去存储冗余的key值。确定好存储方式,我们需要想一下怎么去进行封装。在python是面向对象语言,同时具有多继承的特色,所以我们可以用拓展类的方式去封装读写操作,在对应的视图类中采取多继承的方式,引入读写的方法。
class CartMixin(object):
"""购物车扩展类"""
str_to_dict_class = (str.encode, base64.b64decode, pickle.loads)
dict_to_dict_class = (pickle.dumps, base64.b64encode, bytes.decode) def conversion_and_encryption(self, key):
# 将数据转化为需要格式的方法
if isinstance(key, dict):
for func in self.dict_to_dict_class:
key = func(key)
else:
for func in self.str_to_dict_class:
key = func(key)
return key def get_cart_dict(self, request):
# 获取购物车的方法
try:
user = request.user
except Exception:
user = None
if user and user.is_authenticated:
return self.get_cart_from_redis(request)
else:
return self.get_cart_from_cookie(request) def write_cart_dict(self, cart_dict, request, response):
# 写入购物车数据的方法
try:
user = request.user
except Exception:
user = None
if user and user.is_authenticated:
self.write_cart_to_redis(cart_dict, user)
return response
else:
response = self.write_cart_to_cookie(cart_dict, response)
return response def get_cart_from_redis(self,request):
# 从redis中获取购物车
redis_conn = get_redis_connection('cart')
redis_cart = redis_conn.get('cart:%s'%request.user.id)
if not redis_cart:
return {}
# redis_cart = pickle.loads(base64.b64decode(redis_cart))
cart_dict = self.conversion_and_encryption(redis_cart.decode())
return cart_dict def get_cart_from_cookie(self,request):
# 从cookie中获取购物车的方法
cart_dict = request.COOKIES.get('cart')
if cart_dict:
# cart_dict = pickle.loads(base64.b64decode(cart_dict.encode()))
cart_dict = self.conversion_and_encryption(cart_dict)
else:
cart_dict = {}
return cart_dict def write_cart_to_redis(self, cart_dict, user):
# 写入购物车数据到redis的方法
redis_conn = get_redis_connection('cart')
# cart_dict = base64.b64encode(pickle.dumps(cart_dict)).decode()
cart_dict = self.conversion_and_encryption(cart_dict)
redis_conn.set('cart:%s'%user.id, cart_dict) def write_cart_to_cookie(self, cart_dict, response):
# 写入购物车数据到cookie的方法
# cart_cookie = base64.b64encode(pickle.dumps(cart_dict)).decode()
cart_cookie = self.conversion_and_encryption(cart_dict)
response.set_cookie('cart', cart_cookie, max_age=constants.CART_COOKIE_EXPIRES)
return response
为了保证数据的可靠性和安全性,我们会对数据进行一些处理在进行存储,考虑到有多个地方可能用到数据处理的操作,我们将数据处理的操作也封装成对应的方法,同时,我们也可能用不同的方式处理数据,所以将处理数据的方法放到一个列表中,用类属性方法进行存储,需要的更改的时候就只需要更改对应的类属性即可。这样我们就完成了读写操作的封装,在需要进行读写操作的地方调用对应的方法即可。这样能减少代码的冗余。
而在对应的业务逻辑中,我们应该只需要考虑业务方面的需要,无需考虑用户的登录状态,同时,购物车数据的读取和写入也是与我们的业务逻辑无关。关于登录状态的判断,已经封装到扩展类当中了,而对于读写,我们可以不必在视图的业务逻辑中进行操作,在drf框架中在请求进来之前会进行一个初始化操作,而在响应返回,传到前端之前,也会进行最后的处理,我们可以在视图类中,重写这两个方法,继承父类的操作,在加上我们需要进行的读写操作即可,这样就实现了读写操作和业务逻辑的分离。
class CartView(CartMixin, APIView):
'''购物车'''
permission_classes = [IsAuthenticated] def perform_authentication(self, request):
"""
重写父类的用户验证方法,不在进入视图前就检查JWT
"""
pass def initial(self, request, *args, **kwargs):
super().initial(request, *args, **kwargs)
self.cart_dict = self.get_cart_dict(request) def finalize_response(self, request, response, *args, **kwargs):
response = super().finalize_response(request, response, *args, **kwargs)
self.response = self.write_cart_dict(self.cart_dict, request, response)
return self.response
至此,代码改写完成。
新人写博客锻炼自己,想一起交流的可以加我的qq595395786
如何以python风格高逼格的改成购物车逻辑的更多相关文章
- python学习——将while循环改成函数
笨办法学python第33节 这一节主要学习内容是while循环,记录内容为将while改成函数,首先源代码如下: i = 0 numbers = [] while i < 6: print & ...
- 用python将SQL格式文件改成自己想要的格式
INSERT INTO TTT (NSAME, ID, AGE) VALUES ('AAA', '201023210816', '22'); 将上面的SQL格式改成以下的格式 AAA|20102321 ...
- Python爬虫,看看我最近博客都写了啥,带你制作高逼格的数据聚合云图
转载请标明出处: http://blog.csdn.net/forezp/article/details/70198541 本文出自方志朋的博客 今天一时兴起,想用python爬爬自己的博客,通过数据 ...
- 教你制作高逼格的技术分享Keynote(PPT)
本文来自 网易云社区 . 作为一个程序猿/媛,想必大家都参与过大大小小各式各样的技术分享,异或在不同的场合分享自己的技术心得.抛开分享内容的质量不谈,笔者发现通常这些分享者的演示文稿(Keynot或P ...
- 多服务器终端交互利器--polysh和atnodes到高逼格日志中心
最近博客更新的少了,相对而言,我在自己的个人公众号里还是挺活跃的,大家可以扫描旁边的二维码,或者微信搜索公众号:“编程一生”加关注. 在分布式的年代,一个应用需要部署到多台服务器上.那么要查看日志文件 ...
- python风格指南
还在让别人一眼就看出你是一只野生程序猿嘛,快来看看谷歌的python风格指南提升逼格吧! http://zh-google-styleguide.readthedocs.io/en/latest/go ...
- js原生高逼格插件
如何定义一个高逼格的原生JS插件 作为一个前端er,如果不会写一个小插件,都不好意思说自己是混前端界的.写还不能依赖jquery之类的工具库,否则装得不够高端.那么,如何才能装起来让自己看起来逼格更高 ...
- python基础——高阶函数
python基础——高阶函数 高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 以Python内置的求绝对值的函数a ...
- Python风格规范
Python风格规范 分号 Tip 不要在行尾加分号, 也不要用分号将两条命令放在同一行. 行长度 Tip 每行不超过80个字符 例外: 长的导入模块语句 注释里的URL 不要使用反斜杠连接行. Py ...
随机推荐
- node调试工具--nodemon使用简介
这个工具和node-supervisor基本上是一致的,但是其功能比较强大,个人觉得在开发环境还是用 nodemon,因为配置比较方便,文档也很清晰.所以这里先主要讲 nodemon. nodemon ...
- 基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法
[目的]鱼类识别对渔业资源的开发利用有着重要的意义.针对海底环境恶劣.拍摄环境亮度低.场景模糊的实际情况导致海底观测视频品质差,视频中的鱼类识别难的问题以及现有鱼类识别方法存在的鱼类标注数据集过少导致 ...
- UVA297 四分树 Quadtrees 题解
题目链接: https://www.luogu.org/problemnew/show/UVA297 附几道推荐题目(先完成再食用此题效果更佳) https://www.luogu.org/probl ...
- Excel催化剂开源第30波-在Excel上尽情地使用LINQ
对于笔者这样的数据分析工作者来说,对数据库有较深的掌握,当然少不了对SQL查询的深度使用,如果在编程的世界中,可以复用这样的能力,真的是一件多么令人高兴的事情. 在.Net的世界中,恰恰提供了这样的能 ...
- Error:(949) Multiple substitutions specified in non-positional format; Android格式化string.xml
string.xml问题代码 <string name="msg">书名:%s\n价格:%d</string> 异常信息 Error:(949) Multi ...
- xutils3 上传文件操作——个人小计
上传文件注意: 使用KeyValue对象进行添加文件操作 int uid = 2; //普通字段的存储 requestParams.addBodyParameter("uid", ...
- C#3.0新增功能09 LINQ 基础03 LINQ 和泛型类型
连载目录 [已更新最新开发文章,点击查看详细] LINQ 查询基于 .NET Framework 版本 2.0 中引入的泛型类型. 无需深入了解泛型即可开始编写查询. 但是,可能需要了解 2 个 ...
- 【MySQL】(六)锁
开发多用户.数据库驱动的应用时,最大的一个难点是:一方面要最大程度地利用数据库的并发访问,另一方面还要确保每个用户能以一致的方式读取和修改数据.为此就有了锁(locking)的机制,同时这也是数据库系 ...
- Linux卸载MySql——ubuntu版
卸载mysql 1)删除mysql的数据文件 sudo rm /var/lib/mysql/ -R 2)删除mqsql的配置文件 sudo rm /etc/mysql/ -R 3)自动卸载mysql的 ...
- 如何处理MySQL经常出现CPU占用率达到99%
如何处理MySQL经常出现CPU占用率达到99% 情况说明: 最近在自己购买的linux服务器上捣鼓了一个小项目,按理说不存在CPU占用率会达到100%的情况,但事实就是经常出现. 然后,我第一反应是 ...