如何在Flask中的其他表单提交结束时登录?

时间:2015-08-25 18:28:55

标签: python flask flask-wtforms flask-login

我正在编写一个网络应用程序,您可以在登录(或注册)之前通过表单提出产品请求。这是一种“尝试”模式,可以降低放弃率。当我们首先提出注册时 - 我们太多人放弃了这项服务,因为他们必须先建立帐户。这样我们就会吸引人们在注册前做出一些努力。

无论如何,我无法使这种模式发挥作用。我正在使用flask-login扩展。我有一个视图,如果用户没有登录,则会呈现我的产品申请表并重定向到登录视图:

@app.route('/customer/gift_request', methods=['GET', 'POST'])
# Note login is NOT required for this.
def gift_request():
    form = GiftRequestForm()
    error = None
    if form.validate_on_submit():
        if current_user.get_id():
            new_gift_request = GiftRequest(
                current_user.id,
                form.giftee_name.data,
                form.giftee_age.data,
                int(form.giftee_sex.data),
                form.event.data,
                form.event_date.data,
                float(form.budget.data))
            try:
                db.session.add(new_gift_request)
                db.session.commit()
                flash("You have successfully submitted a gift request! ",'success')
                return redirect(url_for('customer_home'))
            except:
                error = "Error creating gift request"
        else:
            return redirect(url_for('login', next=request.url)

    return render_template('customer_portal/gift_request.html', form=form, error=error) 

我的登录视图如下:

@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    error = None
    if form.validate_on_submit():
        user = User.query.filter_by(email=form.email.data).first()
        if user:
            if bcrypt.hashpw(form.password.data.encode('utf-8'), user.password.encode('utf-8')) == user.password:
                login_user(user)
                flash('User {} logged in'.format(current_user.email), 'success')

                # Handle the next URL
                next_url = request.args.get('next')
                if next_url is not url_for('gift_request'):
                    return abort(400)

                return redirect(next_url or url_for('customer_home'))
            else:
                error = "Incorrect password"
        else:
            error = "User not found"
    return render_template("user/landing_page.html",
                       login_form=form,
                       register_form=RegisterForm(),
                       error=error,
                       show_login_modal=True,
                       show_register_modal=False)

请注意,我的登录信息会在目标网页上呈现为模式窗口。在任何情况下,我都不知道如何在登录后保留我的礼物请求表单数据。我如何通过它?我尝试了很多东西 - 比如把它放在请求中 - 但是感觉很麻烦(而且可能不安全)。此外,在登录提交时 - 表单数据消失了。它永远不会传递给登录模板,所以我猜它只是消失了。我搜索过互联网,但我似乎找不到这样做的模式。

此外,登录只是其中的一部分 - 如果填写礼物请求的人没有登录,那么我想带他们到注册页面来创建一个帐户。但我想如果我弄清楚这一点 - 我可以采用相同的模式并将其扩展到那个。

1 个答案:

答案 0 :(得分:1)

我认为您可能需要使用会话。它看起来像这样:

if form.validate_on_submit():
    if current_user.get_id():
        session['new_gift_request'] = GiftRequest(
            current_user.id,
            form.giftee_name.data,
            form.giftee_age.data,
            int(form.giftee_sex.data),
            form.event.data,
            form.event_date.data,
            float(form.budget.data))

我已经多次使用过,而且我从来没有遇到过这个问题。如果您希望表单数据在没有会话的情况下挂起,那么您必须跟踪它并将其传递给每个后续模板。

更新

重新读取代码后,似乎如果当前用户未登录,则根本不保存表单数据。这是一个微小的变化(显然确保你从烧瓶中导入会话):

@app.route('/customer/gift_request', methods=['GET', 'POST'])
# Note login is NOT required for this.
def gift_request():
    form = GiftRequestForm()
    error = None
    if form.validate_on_submit():
        if current_user.get_id():
            new_gift_request = GiftRequest(
                current_user.id,
                form.giftee_name.data,
                form.giftee_age.data,
                int(form.giftee_sex.data),
                form.event.data,
                form.event_date.data,
                float(form.budget.data))
            try:
                db.session.add(new_gift_request)
                db.session.commit()
                flash("You have successfully submitted a gift request! ",'success')
                return redirect(url_for('customer_home'))
            except:
                error = "Error creating gift request"
        else:
            session['giftee_name'] = form.giftee_name.data
            session['giftee_age'] = form.giftee_age.data
            session['giftee_age'] = form.giftee_age.data
            session['giftee_sex'] = int(form.giftee_sex.data)
            session['event'] = form.event.data
            session['event_date'] = form.event_date.data
            session['budget'] = float(form.budget.data)
            return redirect(url_for('login', next=request.url)

    return render_template('customer_portal/gift_request.html', form=form, error=error)