python - FlaskForm 验证码 : checking if a user alread

因此,当我谈到关于在注册帐户时检查用户名或电子邮件是否已被使用的部分时,我正在学习 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 类中的两个函数:首先,这两个函数如何知道用户名和电子邮件是什么?例如,如果我将函数定义中的“用户名”和“电子邮件”参数更改为“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')

这是在屏幕上创建表单用户界面的原因,也是最终用户在注册时看到的内容。此表单创建是通过 flask_wtf 完成的库,并在 Jinja2 的帮助下呈现在 html 页面中. Jinja2是一个模板引擎,Python 可以利用它来为服务器端页面提供动态数据。 现在这个表单定义中的变量是什么意思?[用户名、电子邮件、密码、确认密码、提交]这些是对表单字段的引用。例如,当用户输入他们的信息以在您的网站上注册一个帐户时,他们使用的用户名将通过引用 form.username.data 来访问。 field 。同样,要获得他们使用的密码,注册时,您必须引用 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 table 。 Sqlalchemy是一个 Python SQL 工具包和 ORM,可以轻松提交 SQL 查询以及将对象映射到表定义,反之亦然。 所以 user = User.query.filter_by(username=username.data).first()正在利用您的 User模型定义,已使用 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>

  1. “如果我将函数重命名为任何其他名称,代码将停止工作,我不明白为什么?”

回答: 您的验证方法必须遵循 validate_<field_name> flask-wtf 中指定的约定在您的示例中,您的表单字段是:[username, email, password, confirm_password, submit] 因此您的验证方法必须是:validate_username(...) , validate_email(...) , validate_password(...)等等...如果您想要不同的验证方法名称,您还必须相应地适本地重命名您的表单字段。

希望对您有所帮助!

关于python - FlaskForm 验证码 : checking if a user already exists or not,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54582898/

相关文章:

c# - 如何从 dapper 返回的复杂对象中修剪所有字符串

angular - MatAutocomplete 值 X 显示

python - 无法使用 python 3.72 连接 firebase

websocket - 错误 : Error when readinrror: Error when

reactjs - 在导航更改时滚动恢复到顶部

python - 如何组合两个 Python Try 异常

amazon-web-services - "kubectl"未从我的本地 Windows 工作站连

angular - 找不到自定义管道 ionic 4 |找不到管道

angular - ng2图表多图表更新

haskell - 计算列表中每个元素的所有出现次数