如何在Django的session购物车字典中移除null值并避免其生成
Django Session购物车出现
null键的解决方案 产生原因
- 前端提交添加购物车请求时,部分请求的
product参数未正确传递商品ID,JavaScript中的null值被提交到后端后解析为字符串'null',原代码未对product参数做合法性校验就直接作为购物车字典的键存储,直接导致了'null'键的产生。 - 原有代码还存在两处逻辑漏洞:
- 购物车初始化逻辑错误:
cart=request.session.get('cart')在session中无购物车数据时会返回None,后续直接对None执行键赋值操作会抛出异常 - 存在冗余硬编码逻辑:不管添加的商品是什么,都强制写入
cart['product']=1,这个键完全无业务意义
- 购物车初始化逻辑错误:
修复方案
后端代码修复
直接替换原有逻辑为以下代码即可:
def index(request): categoryID = request.GET.get('category') product = request.POST.get('product') # 购物车不存在时默认初始化为空字典,避免None报错 cart = request.session.get('cart', {}) # 仅当product参数合法时才执行加购操作,从根源阻止非法键存入 if product and product != 'null' and product.strip(): quantity = cart.get(product, 0) cart[product] = quantity + 1 # 主动清理已存在的非法键和冗余键 cart.pop('null', None) cart.pop('product', None) request.session['cart'] = cart print(cart) print(product) category = Category.get_all_categories() if categoryID: products = Product.get_all_products_by_id(categoryID) else: products = Product.get_all_products() prddata = { 'product' : products, 'cat': category, } return render(request,'index.html',prddata)
补充前端校验(可选,优化体验)
建议排查前端加购逻辑,确认触发null参数的场景:比如是否存在未选择商品就触发加购的逻辑、是否JS获取商品ID时拿到空值未做过滤就提交,前端层面加一层参数校验可以避免无效请求发到后端。
内容的提问来源于stack exchange,提问作者Abu RayhaN
相关产品推荐
相关产品推荐

