处理表单之间的数据

use*_*318 5 python forms flask flask-wtforms

如果我有 3 个步骤的注册,那将使用 3 个表格。

像这样的东西,只是为了证明:

@app.route('/form/step1', methods=['GET', 'POST'])
def form_step1():
    form = form_step_1(request.form)
    ...validate()...
    return render_template('register.html', form=form)

@app.route('/form/step2', methods=['GET', 'POST'])
def form_step2():
    form = form_step_2(request.form)
    ...validate()...
    return render_template('register.html', form=form)

@app.route('/form/step3', methods=['GET', 'POST'])
def form_step3(): 
    form = form_step_3(request.form)
    ...validate()...
    return render_template('register.html', form=form)
Run Code Online (Sandbox Code Playgroud)

在这三个步骤之间处理数据的正确方法是什么?在第 3 步结束时,所有数据都应提交到数据库。但表单之间的后退操作应再次填充前一个表单。

为此目的使用会话似乎很糟糕。

Ale*_*sen 4

我个人建议使用会话对象将数据从一种表单传递到另一种表单。如果您有少量数据,那么您可以只使用 Flask 具有的 cookie 实现。否则,您可以覆盖默认会话对象以使用 Redis 在服务器端存储会话数据。这使您可以使用会话对象,而无需付出在 cookie 中存储大量数据的代价。这意味着你可以做类似的事情

@app.route('/form/step1', methods=['GET', 'POST'])
def form_step1():
    form1 = form_step_1(request.POST)
    user_id = current_user.user_id # If you're using flask-login
    ...validate()...
        # dictionary that holds form1, form2, etch
        form_data = {"form1": form1, "form2": None, "Form3"=None} 
        flask.session[user_id] = form_data
        redirct_to(url_for("form_step2"))
    return render_template('register.html', {'form':form1})  

@app.route('/form/step2', methods=['GET', 'POST'])
def form_step2():
    form1 = session[user_id][form1]
    # A simpler way than passing the whole form is just the data 
    # you want but for this answer I'm just specifying the whole form.
    form = form_step_2(form1)
    user_id = current_user.user_id # If you're using flask-login 
    ...validate()...
        # dictionary that holds form1, form2, etch
        flask.session[user_id]["form2"] = form2
        redirct_to(url_for("form_step3"))
    return render_template('register.html', form=form)
Run Code Online (Sandbox Code Playgroud)