Вчера у меня возникла странная проблема, в которой я пытаюсь разобраться. У меня есть система обработки заказов для малого бизнеса. Я использую 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)
' ''