为什么flask session 购物车数量不更新?

问题描述

我在尝试使用flask session 实现购物车的功能,源代码如下:

from flask import Flask, session, request

app = Flask(__name__)
app.secret_key = 'secret'

@app.route('/')
def hello_world():
    return "<p>Hello, World!</p>"

@app.route('/cart')
def cart():
    if 'cart' in session:
        # 如果购物车存在就输出购物车
        print(session['cart'])
    return 'cart'

@app.route('/add-to-cart', methods=('GET', 'POST'))
def add_to_cart():
    product_id = request.form.get('product_id')
    product_quantity = int(request.form.get('product_quantity'))
    print(product_id, product_quantity)
    if 'cart' not in session:
        # 初始化购物车
        session['cart'] = {}
    if product_id not in session['cart']:
        # 将商品添加到购物车
        session['cart'][product_id]={'pdoct_id':product_id, 'product_quantity': product_quantity}
    else:
        # 更新购物车
        print('更新前', session['cart'])
        session['cart'][product_id]['product_quantity'] += product_quantity
        print('更新后', session['cart'])
    return 'add-to-cart'

@app.route('/clear-cart')
def clear_cart():
    session.clear()
    return 'clear-cart'
购物车内容是 {'101': {'pdoct_id': '101', 'product_quantity': 2}}
127.0.0.1 - - [03/Mar/2023 10:44:33] "GET /cart HTTP/1.1" 200 -
更新前 {'101': {'pdoct_id': '101', 'product_quantity': 2}}
更新后 {'101': {'pdoct_id': '101', 'product_quantity': 4}}
127.0.0.1 - - [03/Mar/2023 10:44:37] "POST /add-to-cart HTTP/1.1" 200 -
购物车内容是 {'101': {'pdoct_id': '101', 'product_quantity': 2}}
127.0.0.1 - - [03/Mar/2023 10:44:42] "GET /cart HTTP/1.1" 200 -

如上所示,添加购物车后访问购物车可以看到购物车添加的商品,我再次通过添加购物车更新商品后也显示商品数量发生变化了,但再次访问购物车的时候还是原来的数量,这位帮忙看下这什么情况,谢谢!

阅读 2.7k
3 个回答

因为你更新的 cart 是字典,其不是简单数据类型。对于这种可变对象,必须在对象修改后,设置 session.modified = True 以更新,详见 Flask API - Sessions

因为你的两个请求不是一个 session

解决方案:

方案一:服务端不用 session,而是搞一个全局变量

方案二:让两个请求是一个 session

是修改session那一步有问题,第一次添加购物车时生成了session,第二次更新是修改session,因为这里没有把修改后的session返回给客户端。所以在第二次添加购物车后,再次查询购物车,能发现第二次添加购物车没有生效。

这里我简单修改了一下:

# 更新购物车
        print('更新前', session['cart'])
        #session['cart'][product_id]['product_quantity'] =  session['cart'][product_id]['product_quantity'] + product_quantity
        old_value = session['cart'][product_id]['product_quantity']
        session['cart'] = {}
        session['cart'][product_id]={'pdoct_id':product_id, 'product_quantity': old_value + product_quantity}
        print('更新后', session['cart'])

第二次再更新的时候,响应头里面重新返回了cookie

image.png

推荐问题
宣传栏