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

时间:2019-02-07 21:52:40

标签: python flask flask-sqlalchemy flask-wtforms

因此,当我进入有关检查注册帐户时是否已使用用户名或电子邮件的部分时,我一直遵循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”运行查询,则代码仍然有效。 其次,如果我要将函数重命名为其他任何代码,代码将停止工作,我不明白为什么?

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

1 个答案:

答案 0 :(得分:1)

我将对此进行彻底的解释,请耐心等待,因为我会在最后回答您的特定问题,以确保您完全了解所有部分如何协同工作。

您的表单定义与此代码段一起给出:

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字段可以访问他们使用的用户名。同样,要获取他们用于注册的密码,您必须引用form.password.data字段,依此类推,以此类推...验证函数:validate_username(...)validate_email(..)是您在RegistrationForm(FlaskForm)类上创建的class方法,以验证用户{{1}和email唯一性,当用户通过单击{{ 1}}按钮。如果另一个用户已经已经使用此用户名或电子邮件地址,则会引发错误那么这是如何完成的呢?在您的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 Python SQL工具包和ORM ,它使提交SQL查询以及将对象映射到表定义变得容易,反之亦然。所以{{1 }}利用user设置的Sqlalchemy模型定义来查询user = User.query.filter_by(username=username.data).first()表,以查看是否有人使用该用户名进行了注册。 User是import语句,它使您可以使用flask-sqlalchemy模型从表单定义文件中查询user表。此外,我们之所以可以使用from flaskblog.models import User而不是必须使用User是因为这是您user中的一个对象方法,因此我们可以直接访问用户名和电子邮件表单字段。 / p>

现在回答您的问题:

  1. ”为什么我将函数定义中的“用户名”和“电子邮件”参数更改为“ u_n”和“ e_mail”,并使用“ u_n.data”和“ e_mail.data”运行查询仍然有效”

答案:这些只是函数参数变量,可以按您认为合适的方式命名,因为您是直接将用户名(或电子邮件)表单字段传递给函数的通过函数声明。即 username.data

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

答案: 您的验证方法必须遵循form.username.data中指定的 RegistrationForm 约定。在您的示例中,您的表单字段为: [用户名,电子邮件,密码,confirm_password,提交] ,因此您的验证方法必须为:validate_<field_name>validate_<field_name>flask-wtf,等等...如果要使用其他验证方法名称,还必须相应地重命名您的表单字段。

希望有帮助!