Код проверки FlaskForm: проверка, существует ли пользователь уже или нет - PullRequest
0 голосов
/ 08 февраля 2019

Итак, я следовал учебному пособию Кори Шафера по Flask, когда пришел к части о проверке того, используется ли уже имя пользователя или адрес электронной почты при регистрации учетной записи.Я не могу понять, как работает этот код, я думаю, это потому, что я новичок в Python и Flask, но все же это не должно быть таким запутанным.

class RegistrationForm(FlaskForm):

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


def validate_username(self, username):
    user = User.query.filter_by(username=username.data).first()
    if user:
        raise ValidationError('That username is taken. Please choose 
        another.')

def validate_email(self, email):
    user = User.query.filter_by(email=email.data).first()
    if user:
        raise ValidationError('That email is taken. Please choose another.')

Итак, конкретная часть, котораяЯ не понимаю, являются ли две функции в классе RegistrationForm: во-первых, как обе функции узнают, что такое имя пользователя и адрес электронной почты?Например, если я изменил аргументы 'username' и 'email' в определениях функций на что-то вроде 'u_n' и 'e_mail', а затем выполнил запрос с 'u_n.data' и 'e_mail.data', код все еще работает,Во-вторых, если я хочу переименовать функции во что-то еще, код перестает работать, и я не понимаю, почему?

Я знаю, что ответ на этот вопрос не может быть слишком сложным, но это меня так раздражало.Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 08 февраля 2019

Я собираюсь объяснить это подробно, поэтому потерпите меня, так как я отвечу на ваши конкретные вопросы в конце, чтобы убедиться, что вы полностью понимаете, как все части работают вместе.

Ваше определение формы данос этим фрагментом кода:

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

Это то, что создает пользовательский интерфейс формы на экране и , в конечном счете, то, что пользователь видит при регистрации .Это создание формы выполняется с помощью библиотеки flask_wtf и отображается на html-странице с помощью Jinja2.Jinja2 - это шаблонизатор , который Python может использовать для обслуживания страниц на стороне сервера с динамическими данными. Теперь, что означают переменные в этом определении формы? Т.е. [имя пользователя, адрес электронной почты, пароль, пароль_подтверждения, отправка] ну, это ссылки на поля формы .Например, когда пользователь вводит свои данные, чтобы зарегистрировать учетную запись на вашем сайте, доступ к имени пользователя, к которому они обращаются, осуществляется путем обращения к полю form.username.data.Точно так же, чтобы получить пароль, который они использовали, чтобы зарегистрироваться, вам нужно сослаться на поле form.password.data и так далее, и так далее ... Функции проверки: validate_username(...) и validate_email(..) - это методы класса, которые вы создали на своемRegistrationForm(FlaskForm) класс для проверки уникальности пользователя email и username пользователя, когда он / она отправляет данные своей учетной записи, нажав кнопку Sign Up.Если другой пользователь уже использует это имя пользователя или адрес электронной почты, будет выдано сообщение об ошибке . Итак, как это сделать? При проверке используются определения вашей модели , созданные в вашем файле models.py:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    image_file = db.Column(db.String(20), nullable=False, default='default.jpg')
    password = db.Column(db.String(60), nullable=False)
    posts = db.relationship('Post', backref='author', lazy=True)

    def __repr__(self):
        return f"User('{self.username}', '{self.email}', '{self.image_file}')"

Эти модели используют flask-sqlalchemyобертка вокруг sqlalchemy, для выполнения запросов в ваших таблицах , в данном примере в вашей таблице user.Sqlalchemy - это Python SQL toolkit и ORM , которые позволяют отправлять запросы SQL, а также отображать объекты в определения таблиц и наоборот. Так что user = User.query.filter_by(username=username.data).first() использует ваш *Определение модели 1052 *, которое было настроено с помощью flask-sqlalchemy, для запроса вашей таблицы user, чтобы узнать, зарегистрировался ли кто-либо еще с этим именем пользователя.from flaskblog.models import User - это оператор импорта, который позволяет вам использовать модель User для запроса таблицы user из файла определения формы.Кроме того, причина, по которой мы можем использовать username.data вместо необходимости использовать form.username.data, заключается в том, что это метод объекта в вашем RegistrationForm, поэтому мы имеем прямой доступ к полям имени пользователя и формы электронной почты.

Теперьчтобы ответить на ваши вопросы:

  1. "Почему, если я изменил аргументы 'username' и 'email' в определениях функций на что-то вроде 'u_n' и 'e_mail' и запустил запрос с помощью 'u_n.data 'и' e_mail.data 'делает код по-прежнему работает "

Ответ : Это всего лишь переменные параметров функции и могут быть названы так, как вы считаете нужным поскольку вы передаете поле формы имени пользователя (или электронной почты) непосредственно в функцию через объявление функции.т.е. validate_<field_name>

«Если я переименую функции во что-то еще, код перестает работать, и я не понимаю, почему?»

Ответ : Ваши методы проверки должны следоватьvalidate_<field_name> соглашение, указанное в flask-wtf В вашем примере поля вашей формы: [имя пользователя, адрес электронной почты, пароль, пароль_подтверждения, отправить] , поэтому ваши методы проверки должны быть:validate_username(...), validate_email(...), validate_password(...) и т. Д. ... Если вы хотите иметь другое имя метода проверки, вам также необходимо соответствующим образом переименовать поля формы соответствующим образом.

Надеюсь, это поможет!

...