Как предотвратить фиксацию SQLAlchemy вместо моей фиксации - PullRequest
0 голосов

Вчера у меня возникла странная проблема, в которой я пытаюсь разобраться. У меня есть система обработки заказов для малого бизнеса. Я использую Flask с SQLAlchemy для подключения к базе данных Amazon RDS. В коде есть конечная точка '/ charge', которая делает то, что написано на банке. Он получает данные корзины и создает начисление Stripe, чтобы заказ сохранялся в базе данных, а плата снималась с карты клиентов.

Вчера, после обработки более 10000 заказов между всеми моими системами, у меня было происходит очень странный случай. Покупатель разместил заказ, он обработан нормально, но сразу после размещения заказа он вернулся в окно оформления заказа с другим товаром в своей корзине.

Запись, которая была сохранена в базе данных, была второй после оплата, товар в корзине. Они заплатили примерно за 15 предметов, но все эти предметы исчезли и были заменены единственным предметом, который они добавили в свою корзину ПОСЛЕ оплаты. У меня есть подозрение, что это может быть связано с тем, как я обрабатываю сеансы с помощью SQLAlchemy, но я не уверен, и, прежде чем я go внесу изменения, я хотел бы получить совет. В настоящее время я объявляю один сеанс, как показано ниже, для всех моих подключений, которые я импортирую в свой файл Flask просмотров:

Создание моего сеанса:

'' '

engine = create_engine(SQLALCHEMY_DATABASE_URI)
db_session = scoped_session(sessionmaker(autocommit=False,
    autoflush=False, bind=engine))

'' '

Ниже мой код, который собирает информацию из запроса, определяет тип размещенного заказа и затем сохраняет запись в базе данных:

'' '

@app.route('/charge', methods= ['POST'])
def charge():
    amount = request.values.get('amount')
    desireddate = request.values.get('desired_date')

    email = str(request.form['stripeEmail'])
    name = str(request.form['stripeBillingName'])
    deliverytype = request.form['deliverytype']
    delivery_add = str(request.form['stripeShippingAddressLine1']) + ", " + \
                                    str(request.form['stripeShippingAddressCity']) + ", " + \
                                    str(request.form['stripeShippingAddressCountry']) + ", " + \
                                    str(request.form['stripeShippingAddressZip'])

    cart_data = session['cart_data']
    desired_date = datetime.datetime.strptime(desireddate, "%d-%m-%Y").date()

    contact_phone = str(request.values.get('contact_number'))
    cart_total = str('%.2f' % (float(amount) / 100))

    data = stock.query.filter_by(display=True).order_by(asc(stock.ranking)).order_by(desc(stock.special_offer)).all()

    try:
        customer = stripe.Customer.create(
                   email=request.form['stripeEmail'],
                   source=request.form['stripeToken']
            )

        stripe.Charge.create(
                customer=customer.id,
                amount=int(amount),
                currency='gbp',
                description='The Tree - {}'.format(email)
            )

        if deliverytype == 'ClickCollect':
            new_order = order(cust_name = name, delivery_address = delivery_add, email_address = email, total_price = float(cart_total),
                              desired_delivery_date = desired_date, placement_date = datetime.date.today(), cust_number = str(contact_phone), delivery_type='Click&Collect')
        else:
            new_order = order(cust_name = name, delivery_address = delivery_add, email_address = email, total_price = float(cart_total),
                              desired_delivery_date = desired_date, placement_date = datetime.date.today(), cust_number = str(contact_phone), delivery_type='Delivery')


        for k, v in cart_data.iteritems():
            ord_item = order_item(name = k, quantity=v['count'], price = float(v['price']))
            new_order.order_items.append(ord_item)

        db_session.add(new_order)
        db_session.commit()

        return render_template("index.html", key=stripe_keys['publishable_key'], data=data, success=True)
    except stripe.error.StripeError as error:
        return render_template("index.html", key=stripe_keys['publishable_key'], data=data, error=True)

' ''

...