проверка ввода пользователя с использованием flask_wtf и sqlalchemy - PullRequest
0 голосов
/ 18 апреля 2020

нубский вопрос. Я создаю страницы входа в систему / регистрации, на странице регистрации я использую flask_wtf для проверки определенных вещей, таких как длина пароля, формат электронной почты и совпадают ли два пароля, предоставленные пользователем. Вот код flask_wtf, который я использую для этого.

# import statements omitted for brevity 
class RegistrationForm(FlaskForm):
    username = StringField('Username',
                           validators=[DataRequired(), Length(min=2, max=20)])
    email = StringField('Email',validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    confirm_password = PasswordField('Confirm Password',
             validators=[DataRequired(),Length(min=4, max=20), EqualTo('password')])
    submit = SubmitField('Sign Up')

После проверки ввода я использую sqlalchemy, чтобы проверить, существуют ли имя пользователя и адрес электронной почты в моей БД. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что я не могу получить flask_wtf для проверки формы. Я могу набрать все, что захочу, и он будет преобразован в sql запрос. Вот мои два flask маршрута, которые обрабатывают регистрацию и проверку ввода пользователя.

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

     form = RegistrationForm()

     if form.validate_on_submit():

         return redirect(url_for('check_user_input'))

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

@app.route('/status',methods=['POST'])
def check_user_input():

    name = request.form.get("username")

    email = request.form.get("email")

    password = request.form.get("password")

    if db.execute("SELECT * FROM DB WHERE username= :username",{"username":name}).rowcount==1:

        return render_template("404.html", message="Sorry username already exists")

    elif db.execute("SELECT * FROM DB WHERE email= :email", 
         {"email":email}).rowcount==1:

         return render_template("404.html", message="Sorry email already exists")

    else:
        db.execute("INSERT INTO DB (username,email,password) VALUES 
        (:username,:email,:password)",

        {"username":name, "email":email,"password":password})

        db.commit()

        return render_template("success.html")

Как я могу получить форму flask_wtf, чтобы сначала выполнить ее проверку, а затем передать ввод функции check_user_input()?

Мой регистр. html содержит следующую строку.

<form class="form-signin" method="POST" action="{{url_for('check_user_input')}}">

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 18 апреля 2020

Можно добавить пользовательскую проверку в форму:

class RegistrationForm(FlaskForm):
    username = StringField('Username',
                           validators=[DataRequired(), Length(min=2, max=20)])
    email = StringField('Email',validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    confirm_password = PasswordField('Confirm Password',
             validators=[DataRequired(),Length(min=4, max=20), EqualTo('password')])
    submit = SubmitField('Sign Up')

    def validate(self):
        rv = FlaskForm.validate(self)
        if not rv:
            return False

        if db.execute("SELECT * FROM DB WHERE username= :username",{"username":self.username.data}).rowcount>0:
            self.username.errors.append('Sorry username already exists')
            return False
        if db.execute("SELECT * FROM DB WHERE email= :email", {"email":self.email.data}).rowcount>0:
            self.email.errors.append('Sorry email already exists')
            return False
        return True
...