Python 烧瓶表单验证代码:检查用户是否已存在

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,

因此,当我来到关于检查注册帐户时是否已经使用用户名或电子邮件的部分时,我正在遵循Corey Schafer的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”运行查询,代码仍然有效。 其次,如果我要将函数重命名为其他任何东西,代码就会停止工作,我不明白为什么


我知道答案不会太复杂,但这让我非常恼火。任何帮助都将不胜感激。

我将详细解释这一点,请耐心等待,因为我将在最后回答您的具体问题,以确保您完全理解所有部分是如何协同工作的

您的表单定义包含以下代码块:

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感谢您的解释。对任何感兴趣的人来说,这些被称为在线验证器。请阅读这里的更多信息