Я собираюсь объяснить это подробно, поэтому потерпите меня, так как я отвечу на ваши конкретные вопросы в конце, чтобы убедиться, что вы полностью понимаете, как все части работают вместе.
Ваше определение формы данос этим фрагментом кода:
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
, поэтому мы имеем прямой доступ к полям имени пользователя и формы электронной почты.
Теперьчтобы ответить на ваши вопросы:
- "Почему, если я изменил аргументы '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(...)
и т. Д. ... Если вы хотите иметь другое имя метода проверки, вам также необходимо соответствующим образом переименовать поля формы соответствующим образом.
Надеюсь, это поможет!