簡體   English   中英

如果您來自特定的 URL,如何使 Flask 中的 app.route() 僅起作用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM