m5web
@m5web
Python, js

Как организовать сессию для корзины покупок во Flask?

Здравствуйте уважаемые коллеги!

Сижу пишу корзину на flask основанную на сессии session["cart"], которая состоит из словаря вида [{'product_id': id, 'qty': qty}] т.е. фактически при добавлении товара в корзину мы добавляем его id в базе и количество(qty).

<form action="/add-to-cart" method="post">
    <input type="hidden" name="add_to_cart">
    <input type="hidden" name="product_id" value="{{ post.id }}">
    <input type="hidden" name="qty" value="1">

    <button type="submit" name="add_to_cart" class="btn btn-success">Add to Cart</button>
</form>


Моё творение выглядит так:
@app.route('/add-to-cart', methods=['GET', 'POST'])
def add_to_cart():
    if request.method == 'POST':
        # приводим оба параметра к числу что бы сессия не материлась
        id = int(request.form['product_id'])
        qty = int(request.form['qty'])

        cart_session() # проверяет существует ли сессия корзины и если нет, то создает её, а если да, то норм

        # проверяем совпадения id product_id и если оно есть, то прибавляем количество qty к уже существующему
        matching = [d for d in session['cart'] if d['product_id'] == id]
        if matching:
            matching[0]['qty'] += qty

        session["cart"].append(dict({'product_id': id, 'qty': qty})) # добавляем товар к сессии в виде словаря

        return redirect(url_for('cart'))


Получается следующая картина при добавлении одного и того же товара:
[{'qty': 9, 'product_id': 6}, {'qty': 1, 'product_id': 6}, {'qty': 1, 'product_id': 6}, {'qty': 1, 'product_id': 6}, {'qty': 1, 'product_id': 6}, {'qty': 1, 'product_id': 6}, {'qty': 1, 'product_id': 6}, {'qty': 1, 'product_id': 6}, {'qty': 1, 'product_id': 6}]

При добавлении товара мой хреновый алгоритм каждый раз прибавляет количество к первому словарю но и добавляет такой же товар с к сессии корзины.

Необходимо:
  1. Проверить по id существует ли товар в сессии корзины
  2. Если существует, не добавлять его в качестве нового товара, а просто увеличивать его количество(qty) в сессии.

==============================================
Решение
@app.route('/add-to-cart', methods=['GET', 'POST'])
def add_to_cart():
    if request.method == 'POST':
        id = int(request.form['product_id'])
        qty = int(request.form['qty'])

        cart_session()

        matching = [d for d in session['cart'] if d['product_id'] == id]
        if matching:
            matching[0]['qty'] += qty
        else:
            session["cart"].append(dict({'product_id': id, 'qty': qty}))

        return redirect(url_for('home'))
  • Вопрос задан
  • 2730 просмотров
Пригласить эксперта
Ответы на вопрос 1
angru
@angru
Flask почти не знаю, но что мешает словарь вместо списка?

cart = session.setdefault('cart', {})
cart[product_id] = cart.get(product_id, 0) + qty
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы