Python 烧瓶表单验证代码:检查用户是否已存在
因此,当我来到关于检查注册帐户时是否已经使用用户名或电子邮件的部分时,我正在遵循Corey Schafer的Flask教程。我一辈子都无法理解这段代码是如何工作的,我想这是因为我对Python和Flask还不熟悉,但它仍然不应该如此混乱Python 烧瓶表单验证代码:检查用户是否已存在,python,flask,flask-sqlalchemy,flask-wtforms,Python,Flask,Flask Sqlalchemy,Flask Wtforms,因此,当我来到关于检查注册帐户时是否已经使用用户名或电子邮件的部分时,我正在遵循Corey Schafer的Flask教程。我一辈子都无法理解这段代码是如何工作的,我想这是因为我对Python和Flask还不熟悉,但它仍然不应该如此混乱 class RegistrationForm(FlaskForm): username = StringField('Username', validators=[DataRequired(), Length(min=4,
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”运行查询,代码仍然有效。
其次,如果我要将函数重命名为其他任何东西,代码就会停止工作,我不明白为什么
我知道答案不会太复杂,但这让我非常恼火。任何帮助都将不胜感激。我将详细解释这一点,请耐心等待,因为我将在最后回答您的具体问题,以确保您完全理解所有部分是如何协同工作的 您的表单定义包含以下代码块:
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')
这就是在屏幕上创建表单UI的原因,最终是用户在注册时看到的。此表单创建使用flask\u wtf
库完成,并在Jinja2
的帮助下在html页面中呈现Jinja2
是一个模板引擎,Python可以利用它为服务器端页面提供动态数据。现在,这个表单定义中的变量是什么意思?例如,[用户名、电子邮件、密码、确认密码、提交]这些是对表单字段的引用。例如,当用户键入其信息以注册您网站上的帐户时,他们使用的用户名将通过引用form.username.data
字段进行访问。同样,要获得他们使用的密码,要注册,您必须引用form.password.data
字段等等。。。验证函数:validate\u username(…)
和validate\u email(…)
是您在注册表单(FlaskForm)上创建的类方法
类,通过单击注册
按钮,验证用户提交帐户详细信息时的电子邮件
和用户名
的唯一性。如果其他用户已经在使用此用户名或电子邮件,则会引发错误。那么这是如何实现的呢?在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
的包装器,在您的表中进行查询,在本例中是您的用户
表Sqlalchemy
是一个Python SQL工具包和ORM,它使提交SQL查询、将对象映射到表定义以及将对象映射到表定义变得非常容易。因此,user=user.query.filter\u by(username=username.data)。first()
正在利用您的user
模型定义来查询您的user
表,查看是否有其他人使用该用户名注册。flaskblog.models导入用户的是一条导入语句,允许您使用用户
模型从表单定义文件中查询用户
表。此外,我们可以使用username.data
而不必使用form.username.data
的原因是,这是您的RegistrationForm
中的对象方法,因此我们可以直接访问用户名和电子邮件表单字段
现在回答您的问题:
“如果我将函数定义中的'username'和'email'参数更改为'u_n'和'e_mail'之类的参数,并使用'u_n.data'和'e_mail.data'运行查询,为什么代码仍然有效?”
回答:这些只是函数参数变量,可以按照您认为合适的方式命名,因为您通过函数声明将用户名(或电子邮件)表单字段直接传递到函数中。i、 e.验证
“如果我想将函数重命名为其他任何东西,代码就会停止工作,我不明白为什么?”
回答:
您的验证方法必须遵循flask wtf
中指定的验证惯例。在您的示例中,您的表单字段是:[用户名、电子邮件、密码、确认密码、提交],因此您的验证方法必须是:验证用户名(…)
,验证电子邮件(…)
,验证密码(…)
,等等。如果您想使用不同的验证方法名称,还必须相应地重命名表单字段
希望这能有所帮助!非常感谢您的详细解释,真的让我明白了很多!祝福!np,很高兴它有帮助+1感谢您的解释。对任何感兴趣的人来说,这些被称为在线验证器。请阅读这里的更多信息