Flask - Использование одной и той же переменной в 2 разных маршрутах? - PullRequest
0 голосов
/ 24 мая 2018

Я работаю в системе регистрации пользователей, в которой после нажатия кнопки «Зарегистрироваться» на сайте представлены 2 формы: первая форма представляет собой типичную форму создания пользователя с именем пользователя, паролем и т. Д., А вторая форма представляет собой форму сличная информация, например, возраст, день рождения и т. д.

Поскольку пользователь потенциально может покинуть свой аккаунт до завершения своего профиля (личная информация), я не хочу на самом деле создавать пользователя, то есть добавлять информацию об имени пользователя / пароле,в базу данных, пока обе формы не будут отправлены.

Существует экземпляр класса 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)

По сути, как передать экземпляр user, созданный в register(), на profile_page(username)?Я слышал, что есть способ сделать это с помощью переменной сеанса, но, предположительно, вы должны избегать этого в максимально возможной степени.Есть ли способ сделать это без этого?Спасибо.

1 Ответ

0 голосов
/ 24 мая 2018

Вы можете сохранить исходное имя пользователя / пароль от начального /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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...