- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,当我谈到关于在注册帐户时检查用户名或电子邮件是否已被使用的部分时,我正在学习 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
中的一个对象方法所以我们可以直接访问用户名和电子邮件表单字段。
现在回答你的问题:
回答:这些只是函数参数变量,可以根据您认为合适的方式命名,因为您将用户名(或电子邮件)表单字段直接传递到函数中通过函数声明。即 validate_<field_name>
回答:您的验证方法必须遵循 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/
因此,我有一个很大的更新表单端点,我已经尝试了一些方法来动态创建它以压缩我的代码,但是我似乎无法弄清楚。 @customers.route("//update_customer", methods=[
代码非常不言自明 - 我想将变量传递给 FlaskForm 子类以供进一步使用。 from flask import Flask, render_template_string from flask_
我有一个现有的 Flask 应用程序,并且正在尝试向其中添加 Flask-Blogging 扩展。当 flask_blogging 尝试 fromflask_wtf import FlaskForm
因此,当我谈到关于在注册帐户时检查用户名或电子邮件是否已被使用的部分时,我正在学习 Corey Schafer 的 Flask 教程。我一辈子都无法理解这段代码是如何工作的,我猜是因为我是 Pytho
我是一名优秀的程序员,十分优秀!