我正在使用Flask使用Stripe API。我想知道如何在切换页面时传递参数,就像我使用redirect(url_for(''))
一样,
例如,
@app.route('/charge', methods=['POST'])
def charge():
amount= #Amount in cents
customer = stripe.Customer.create(
email='customer@example.com',
source=request.form['stripeToken']
)
charge = stripe.Charge.create(
customer=customer.id,
amount=amount,
currency='usd',
description='Test'
)
当我完成输入卡片信息后,页面将切换到其他页面并创建令牌。现在我想从上一页获得金额作为参数。但是在使用Stripe API时我不知道该怎么做。
通常,我可以像这样的回答那样做 redirect while passing arguments
我该怎么做?
我试过第一个人的方式,但它没有用。
上一页是这样的
在此页面上,用户将通过条纹签出窗口输入他们的卡片信息,输入后,它会重定向到charge
页面。
@app.route('/checkout', methods=['GET'])
def checkout():
item_id = request.args['item_id']
item = Item.query.filter_by(id=item_id).first()
return redirect(url_for('charge', item_id=item_id), code=307)
return render_template('checkout.html', title='Check Out',key=stripe_keys['publishable_key'], item=item)
当我进入此页面时
Bad Request
The browser (or proxy) sent a request that this server could not understand.
此错误消息显示在页面上。
答案 0 :(得分:2)
解决方案如下:
from flask import Flask, request
@app.route('/previouspage/', methods=['GET'])
def previous_page():
item = Item.query.filter_by(id=item_id).first()
redirect(url_for('charge', amount=item.price), code=307)
@app.route('/charge/<amount>', methods=['GET', 'POST'])
def charge(amount):
customer = stripe.Customer.create(
email='customer@example.com',
source=request.form['stripeToken']
)
charge = stripe.Charge.create(
customer=customer.id,
amount=amount,
currency='usd',
description='Test'
)
但是,避免在URls中传递路径变量的更正确的方法是使用查询字符串(例如,charge?amount = 10.0)。像这样:
@app.route('/previouspage/', methods=['GET'])
def previous_page():
item = Item.query.filter_by(id=item_id).first()
return redirect(url_for('charge', amount=item.price), code=307)
@app.route('/charge', methods=['GET', 'POST'])
def charge():
amount = request.args.get('amount')
customer = stripe.Customer.create(
email='customer@example.com',
source=request.form['stripeToken']
)
charge = stripe.Charge.create(
customer=customer.id,
amount=amount,
currency='usd',
description='Test'
)
请注意,这两种方法都不安全,因为有人可以更改网址中的价格。所以更好的是你应该只传递Item ID并在/charge
中获取项目。像这样:
@app.route('/previouspage/', methods=['GET'])
def previous_page():
return redirect(url_for('charge', item_id=item_id), code=307)
@app.route('/charge', methods=['GET', 'POST'])
def charge():
amount = request.args.get('item_id')
item = Item.query.filter_by(id=item_id).first()
if not item:
return '....some kind of error'
customer = stripe.Customer.create(
email='customer@example.com',
source=request.form['stripeToken']
)
charge = stripe.Charge.create(
customer=customer.id,
amount=item.price,
currency='usd',
description='Test'
)