在两种不同的途径中使用相同变量的Flask?

2024-03-28 16:17:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个用户注册系统,一旦点击“注册”,网站就会显示两个表单:第一个表单是一个典型的用户创建表单,其中包含用户名、密码等,第二个表单是一个包含个人信息的表单,如年龄、生日等

因为用户可能会在完成个人资料(个人信息)之前离开,所以我不想实际创建用户,即添加用户名/密码信息。直到两个表单都提交。你知道吗

有一个以第一个表单(User)创建的register()类的实例需要添加到数据库中,但是这个实例是在提交第一个表单之后创建的。你知道吗

所以,我的问题是,有没有办法把变量从第一页传递到下一页?你知道吗

代码如下:

@app.route("/profile-creation/<username>", methods = ['GET', 'POST'])
def profile_creation(username):
    form = ProfileForm()

    if form.validate_on_submit():

        # I would like to use the class "user" created in register() here.
        # The user class would be added and commited to a SQLite database.

        flash(f'You have successfully created your account!', 'success')

        return redirect(url_for('homepage'))

    return render_template('profile-creation.html', title = "Create Your Profile", form = form)


@app.route("/register", methods = ['GET', 'POST'])
def register():
    form = RegistrationForm()

    if form.validate_on_submit():
        hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')

        user = User(username = form.username.data, first_name = form.first_name.data, last_name = form.last_name.data,
        email = form.email.data, password = hashed_password)

        username = user.username

        flash(f'Please set up your profile to create your account.', 'success')

        return redirect(url_for('profile_creation', username = username))

    return render_template('register.html', title = 'Register', form = form)

本质上,如何将在register()中创建的user实例传递到profile_page(username)?我听说有一种方法可以使用session变量来实现这一点,但是应该尽可能避免使用这些变量。有没有办法不用它?非常感谢。你知道吗


Tags: to实例用户nameformregister表单your
1条回答
网友
1楼 · 发布于 2024-03-28 16:17:20

您可以将初始/register中的原始用户名/密码存储在flask.session。然后,当用户完成其余的设置时,/profile-creation,可以将接收到的完整输入提交到数据库:

import flask 
app = flask.Flask(__name__)

@app.route("/profile-creation/<username>", methods = ['GET', 'POST'])
def profile_creation(username):
   form = ProfileForm()
   if form.validate_on_submit():
       #get any other input fields here
       conn = sqlite3.connect('dbname.db').cursor()
       conn.execute('INSERT INTO users VALUES (?, ?, ?)', [flask.session['username'], flask.session['email'], flask.session['password'])
       #you can add additional columns to your actual database. The above is just an example
       conn.commit()
       conn.close()
       return redirect(url_for('homepage'))
   return render_template('profile-creation.html', title = "Create Your Profile", form = form)


@app.route("/register", methods = ['GET', 'POST'])
def register():
  form = RegistrationForm()
  if form.validate_on_submit():
    hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')
    user = User(username = form.username.data, first_name = form.first_name.data, last_name = form.last_name.data,
    email = form.email.data, password = hashed_password)
    username = user.username
    flask.session['password'] = hashed_password
    flask.session['username'] = user
    flask.session['email'] = email
    flash(f'Please set up your profile to create your account.', 'success')
    return redirect(url_for('profile_creation', username = user))
  return render_template('register.html', title = 'Register', form = form)

flask.session存储在flask内置服务器运行期间在整个应用程序中传递的任何值。你知道吗

相关问题 更多 >