17.4 合并购物车

分析

用户登录后,将Cookie中的购物车商品合并到redis数据库中。如果此时redis中已经有相同id的商品,则使用Cookie中的数据覆盖redis中的数据。

合并功能需要在用户登录后实现,但登录视图中应避免过多与登录逻辑无关的逻辑,所以考虑对合并功能封装成一个函数,在登录视图中调用。

实现

在carts应用下创建utils.py文件,在utils.py中定义合并购物车功能的函数。

import base64
import picklefrom django_redis import get_redis_connectiondef merge_carts_cookies_redis(request, user, response):"""合并购物车数据"""# 获取cookie中的数据cookie_cart_str = request.COOKIES.get('carts')if not cookie_cart_str:return response# 从cookie中取出数据,放入字典cookie_cart_dict = pickle.loads(base64.b64decode(cookie_cart_str.encode()))new_cart_dict = {}new_cart_selected_add = []new_cart_selected_remove = []# 覆盖for sku_id, cookie_dict in cookie_cart_dict.items():new_cart_dict[sku_id] = cookie_dict['count']if cookie_dict['selected']:new_cart_selected_add.append(sku_id)else:new_cart_selected_remove.append(sku_id)redis_conn = get_redis_connection('carts')pl = redis_conn.pipeline()if new_cart_dict:# 同步商品数据pl.hmset('carts_%s' % user.id, new_cart_dict)if new_cart_selected_add:pl.sadd('selected_%s' % user.id, *new_cart_selected_add)else:pl.srem('selected_%s' % user.id, *new_cart_selected_remove)pl.execute()response.delete_cookie('carts')return response

在登录视图类LoginView中,登录成功后调用上述合并函数,LoginView视图类全部代码如下

class LoginView(View):def get(self, request):return render(request, 'login.html')def post(self, request):username = request.POST.get('username')password = request.POST.get('password')remembered = request.POST.get('remembered')if not all([username, password]):return HttpResponseForbidden('缺少必须参数')if not re.match(r'^[a-zA-Z0-9_-]{5,20}$', username):return HttpResponseForbidden('请输入正确的用户名')if not re.match(r'^[a-zA-Z0-9]{8,20}$', password):return HttpResponseForbidden('密码8-20位')user = authenticate(username=username, password=password)if user is None:return render(request, 'login.html', {'account_errmsg': '账号或密码错误'})login(request, user)print(request.session.session_key)if remembered != 'on':request.session.set_expiry(0)else:request.session.set_expiry(None)  # 2周过期# 在Django中,request.GET.get('next')的值是一个字符串,它代表用户在登录前尝试访问的原始URL。# 这个值由Django自动添加到登录URL中,用于在用户成功登录后将其重定向回原始页面。next = request.GET.get('next')print(next)if next:# 重定向到nextresponse = redirect(next)else:# 重定向到首页response = redirect(reverse('contents:index'))# 新增设置cookieresponse.set_cookie('username', user.username, max_age=3600 * 24 * 14)response = merge_carts_cookies_redis(request,user,response)return response

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919105.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RK3588消费级8K VR一体机 是否有坑?

​​芯片平台​​​​定位场景​​​​核心优势​​​​消费级功能性短板​​全志H8/RK3288入门级VR低成本、基础性能稳定算力弱(4*A55)、无NPU、显示分辨率仅1080P高通XR1中端VR/AR均衡性能(Adreno 615 GPU)仅WiFi5、续航≤4小时…

基于Spring Boot校园二手交易平台系统设计与实现 二手交易系统 交易平台小程序

🔥作者:it毕设实战小研🔥 💖简介:java、微信小程序、安卓;定制开发,远程调试 代码讲解,文档指导,ppt制作💖 精彩专栏推荐订阅:在下方专栏&#x1…

Nginx 服务器常用操作

一. Nginx 常用配置 1. Nginx 总配置文件 nginx 安装目录下的 nginx.conf 文件: # 指定 Nginx worker 进程运行的系统用户 user nginx; # 自动根据 CPU 核心数启动相应数量的 worker 进程,充分利用多核。 worker_processes auto; # 自动将 worker 进程绑定到特定 …

PHP官方及第三方下载地址全指南(2025最新版)

PHP官方及第三方下载地址全指南(2025最新版) 本文整理了PHP官方及主流第三方下载渠道,包含PHP 5.5至8.4各版本的直接下载链接,助您快速获取安全可靠的PHP环境。 一、PHP官方下载渠道 1.1 全球主站下载 网址:https://…

深度剖析Redisson分布式锁项目实战

今天在练手项目中也是遇到了许多新的技术,其中我认为最深刻的还是Redisson分布式锁,这里我就结合一下我项目中用到Redisson分布式锁的代码来讲述一下Redisson分布式锁,希望可以帮助大家更深刻地理解这项技术。在之前的文章中我已经讲过Rediss…

第四天-创建一个Classic CAN(经典CAN2.0)/CANFD的系统描述ARXML文件

【ARXML专题】-构建CAN/CANFD通信系统:ARXML实战指南 汽车神经系统的"高速公路" 想象一辆现代汽车如同人体,电子控制单元(ECU)是器官,而CAN总线就是连接它们的神经系统。在自动驾驶时代,传统CAN2.0的"乡间小路"已无法满足数据传输需求,CANFD的"…

用架构建模工具Sparx EA绘制企业转型路线图

企业数字化转型面临诸多挑战:信息壁垒导致各部门协同困难,资源投入缺乏科学评估,潜在风险难以提前预判。这些问题不仅拖慢转型进程,还可能引发高昂的试错成本。 本文将阐述如何运用架构建模工具Sparx EA的核心功能——可视化路线…

STM32——GPIO

总 :STM32——学习总纲 参考资料: STM32F1系列参考手册-V10(中) 一、GPIO简介 1.1 GPIO 特点 1.2 GPIO 电气特性* stm32芯片资料STM32F103ZET6(English) 1.3 GPIO 引脚分布 电源引脚:V开头 晶振引脚: …

NUX MG-400 吉他效果器功能原理介绍

NUX MG-400 是一款多功能数字吉他效果器,它的核心原理就是把吉他的模拟信号,通过 A/D 转换变成数字信号 → 在 DSP 芯片上做建模运算 → 再通过 D/A 转换还原成模拟信号输出。 它的硬件 软件协作设计,基本可以拆成几个模块来看: …

Linux——进程管理和计划任务管理

文章目录前言一、程序与进程的关系1.1 程序与进程的定义1.2 父进程与子进程二、查看进程信息2.1 ps 命令(重点)2.2 动态查看进程信息top命令(重点)2.3 pgrep命令查询进程信息2.4 pstree命令以树形结构列出进程信息三、进程的启动方…

阿里云TranslateGeneral - 机器翻译SDK-自己封账单文件版本—仙盟创梦IDE

仙盟创梦IDE代码<?php /*** 阿里云机器翻译通用版API调用工具* 文档参考&#xff1a;https://help.aliyun.com/zh/machine-translation/developer-reference/api-alimt-2018-10-12-translategeneral*/ class AliyunTranslate {// 阿里云访问密钥private $accessKeyId;priva…

新字符设备驱动实验

经过前两章实验的实战操作&#xff0c;我们已经掌握了 Linux 字符设备驱动开发的基本步骤&#xff0c;字符 设备驱动开发重点是使用 register_chrdev 函数注册字符设备&#xff0c;当不再使用设备的时候就使用 unregister_chrdev 函数注销字符设备&#xff0c;驱动模块加载成功…

【更新公告】C++算法·线段树

之前的线段树知识都忘了qwq 现在在重新学线段树 下一篇就是写线段树了&#xff0c;例题已经找好了 A了1遍&#xff0c;但是用的玄学代码ee 下面是更新公告 更新公告 更新模式改为2~3天1篇 但是绝对高质量&#xff01;&#xff01; (平均质量分93够吗qwq) 如果例题好找尽量给出2…

pyqtgraph 库 右键菜单栏插件汉化

第一步&#xff0c;打开pyqtgraph文件夹。 第二步&#xff1a;打开graphicsItems&#xff0c;将PlotItem和ViewBox中的.py文件中的英文替换为中文&#xff0c;运行软件即可看到插件右键的菜单栏成为中文。 第三步&#xff1a;GraphicsScene中的&#xff0c;等找到相应的右键菜单…

docker镜像解决的一些问题

1 概述Docker镜像技术通过创新性的设计&#xff0c;彻底解决了应用交付领域的核心痛点&#xff0c;已经成为已成为云原生时代的事实标准。其核心价值在于​​通过标准化封装实现"一次构建&#xff0c;处处运行"​​&#xff0c;从根本上改变了软件交付的生命周期。2 …

10.从开始写LINUX内核——时钟中断

Linux 0.12 内核时钟中断实现&#xff1a;从初始化到中断响应时钟中断是操作系统中最基础且最重要的中断之一&#xff0c;它为系统提供时间基准&#xff0c;支持进程调度、定时器等核心功能。本文将基于 Linux 0.12 内核的 setup 程序框架&#xff0c;详细介绍时钟中断的完整实…

Effective C++ 条款45:运用成员函数模板接受所有兼容类型

Effective C 条款45&#xff1a;运用成员函数模板接受所有兼容类型核心思想&#xff1a;使用成员函数模板&#xff08;member function templates&#xff09;生成可接受兼容类型的函数&#xff0c;特别是泛型拷贝构造函数和赋值操作符&#xff0c;同时避免抑制编译器生成的默认…

华测科技(北京)的3D GPR数据分析

很高兴得到了张总的支持&#xff0c;获得了他们雷达的数据&#xff0c;并写了雷达数据读取和转换文件。1 背景搜索后发现 华测科技&#xff08;北京&#xff09;有限公司 的实力很强&#xff0c;因为他们的检测可达100km/h的时速。以前我只知道行业内 青岛中电众益 的3D GPR产…

X86、ARM与C86架构全面对比分析:性能、功耗、成本与生态系统

目录标题X86、ARM与C86架构全面对比分析&#xff1a;性能、功耗、成本与生态系统一、架构概述与发展背景1.1 X86架构&#xff1a;PC与服务器市场的传统霸主1.2 ARM架构&#xff1a;移动领域的王者与新兴服务器力量1.3 C86架构&#xff1a;国产x86兼容的创新尝试二、性能表现对比…

w嵌入式分享合集66

自己的原文哦~ https://blog.51cto.com/whaosoft/14132240 一、STM32的NRST管脚异常复位问题 这个问题是客户对开发的平台做EMS 浪涌测试的时候发生的&#xff0c;平台上使用了一个STM32G474 RCT6 MCU 。在某个等级的EMS 测试中&#xff0c; 客户发现MCU有时候会异常…