[英]How to make an app.route() in Flask only functional if you are coming from a specific URL?
我正在創建一個項目來學習如何使用 Stripe 並與注冊模板一起工作。 我與 Stripe 的集成工作正常,我可以成功付款,付款完成后,我被重定向到我的注冊模板。
問題是,您應該只能在通過 Stripe 集成后才能訪問注冊模板,但實際情況是任何手動訪問“/register”URL 的人都可以通過付款階段並在注冊模板中注冊自己。
我在這個過程中使用的路線是:
@app.route('/stripe_pay')
def stripe_pay():
session = stripe.checkout.Session.create(
payment_method_types=['card'],
line_items=[{
'price': '{{ PRICE ID }}',
'quantity': 1,
}],
mode='subscription',
success_url=url_for('register', _external=True),
cancel_url=url_for('signup', _external=True),
)
return {
'checkout_session_id': session['id'],
'checkout_public_key': app.config['STRIPE_PUBLIC_KEY'],
}
'/register' 路由執行用戶數據收集,然后將所有信息記錄在數據庫中。 這個過程一切正常。
@app.route('/register')
def register():
form = RegistrationForm()
if form.validate_on_submit():
todb = c_personal_info( first_name = form.first_name.data,
last_name = form.last_name.data,
email = form.email.data,
password = form.password.data,
subscription='M')
with db.session.begin():
db.session.add(todb)
flash('Thanks for registering! You can now login!', category="success")
return redirect(url_for('login'))
return render_template('register.html', form = form)
session 未經過身份驗證,因為“/register”模板實際上是您創建登錄憑據的地方。
我的問題是,當您來自“/stripe_pay”端點時,如何使“/register”端點只能訪問? 我也很想聽聽您的想法和對此的不同看法。
學習使用裝飾器來處理您的問題。 例如,請參閱https:\/\/flask.palletsprojects.com\/en\/2.0.x\/tutorial\/views\/<\/a> 。
def login_required(view):
@functools.wraps(view)
def wrapped_view(**kwargs):
if g.user is None:
return redirect(url_for('auth.login'))
return view(**kwargs)
return wrapped_view
我通過使用“@login_required”裝飾器和“Flask-Login”中的“current_user”模塊解決了我的問題。
1 - 作為最后一步,在路由到我要保護的路由之前,我使用“管理員”用戶登錄。 我為此和其他特權訪問創建了該用戶。
2 - 我用“@login_required”裝飾了目標路由,所以我阻止了未登錄的用戶,然后我使用了“current_user”,條件是只允許“admin”用戶繼續。 任何其他登錄用戶將被重定向到不同的 URL。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.