FlaskForm 验证代码:检查用户是否已经存在

FlaskForm Validation Code: checking if a user already exists or not

因此,当我进入有关检查注册帐户时是否已使用用户名或电子邮件的部分时,我正在关注 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中的两个函数class:首先,这两个函数如何知道用户名和电子邮件是什么?例如,如果我将函数定义中的 'username' 和 'email' 参数更改为 'u_n' 和 'e_mail' 之类的内容,然后 运行 使用 [=21= 的查询] 和 '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_wtf 库完成的,并在 Jinja2 的帮助下呈现在 html 页面中。 Jinja2 是一个 模板引擎 ,Python 可以利用它来为服务器端页面提供动态数据。 现在这个表单定义中的变量是什么意思?[用户名、电子邮件、密码、confirm_password、提交] 这些是对表单字段的引用。例如,当用户输入他们的信息以在您的网站上注册一个帐户时,他们使用的用户名将通过引用 form.username.data 字段来访问。同样,要获得他们使用的密码,注册时,您必须引用 form.password.data 字段等等......验证函数:validate_username(...)validate_email(..) 是class 您在 RegistrationForm(FlaskForm) class 上创建的方法,用于验证用户 emailusername 唯一性 he/she 通过单击 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 的包装器,在您的 tables 中进行 查询,在这个例子中是您的usertable。 Sqlalchemy 是一个 Python SQL 工具包和 ORM 可以轻松地 提交 SQL 查询以及将对象映射到 table 定义,反之亦然。 因此 user = User.query.filter_by(username=username.data).first() 正在利用您的 User 模型定义,该定义已使用 flask-sqlalchemy 设置,以查询您的 user table 查看是否有其他人使用该用户名注册。 from flaskblog.models import User 是允许您使用 User 模型从表单定义文件中查询 user table 的导入语句。此外,我们可以使用 username.data 而不是必须使用 form.username.data 的原因是因为这是您 RegistrationForm 中的一个对象方法,因此我们可以直接访问用户名和电子邮件表单字段。

现在回答您的问题:

  1. "Why if I change the 'username' and 'email' arguments in the function definitions to something like 'u_n' and 'e_mail' and ran the query with 'u_n.data' and 'e_mail.data' does the code still works"

回答:这些只是函数参数变量,可以根据您认为合适的方式命名,因为您传递的是用户名(或email) 表单字段通过函数声明直接进入函数。即 validate_<field_name>

  1. "If I to rename the functions to anything else the code stops working and I don't understand why?"

回答: 您的验证方法必须遵循 validate_<field_name> 中指定的约定 flask-wtf 在您的示例中,您的表单字段是:[用户名、电子邮件、密码, confirm_password, submit] 所以你的验证方法必须是: validate_username(...), validate_email(...), validate_password(...), 等等...如果你想有不同的验证方法名称,您还必须相应地适当地重命名您的表单字段。

希望对您有所帮助!