回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>因此,我试图在我的Flask应用程序中实现自定义验证器,但遇到了一个问题。我为RegisterForm编写的自定义验证器UniqueRequired()似乎正在工作,但我的LoginForm验证器似乎根本没有被调用,ValidUsername()中的print语句没有打印。我已经尝试过将验证器放在同一个文件中,在不同的语句中导入它们,并更改验证器的顺序,但是没有任何效果</p>
<p>这是我的forms.py文件:</p>
<pre><code>from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired, Length, EqualTo
from validators import UniqueRequired, VaildUsername, ValidPassword
class LoginForm(FlaskForm):
username = StringField("Username:", validators=[DataRequired(), VaildUsername], id="username")
password = PasswordField("Password:", validators=[DataRequired(), ValidPassword], id="password")
class RegisterForm(FlaskForm):
username = StringField("Username:", validators=[DataRequired(), UniqueRequired, Length(min=5, max=25)], id="username")
password = PasswordField("Password:", validators=[DataRequired(), Length(min=8)], id="password")
confirmpassword = PasswordField("Confirm Password:", validators=[DataRequired(), EqualTo('password', message="Passwords don't match")], id="conpassword")
</code></pre>
<p>My validators.py文件:</p>
<pre><code>def UniqueRequired(form, field):
otheruser = User.query.filter_by(username=field.data).first()
if otheruser:
raise ValidationError("Username Taken")
def VaildUsername(form, field):
user = User.query.filter_by(username=field.data).first()
print(user)
if not user:
raise ValidationError("Invalid Username")
def ValidPassword(form, field):
user = User.query.filter_by(username=form.username.data).first()
if not check_password_hash(user.password, field.data):
raise ValidationError("Incorrect Password")
</code></pre>
<p>以及我的/登录和/注册路径:</p>
<pre><code>@app.route("/login", methods=["GET", "POST"])
def login():
form = LoginForm()
if form.validate_on_submit:
print("Form Valid")
return render_template("login.html", form=form)
@app.route("/register", methods=["GET", "POST"])
def register():
form = RegisterForm()
if form.validate_on_submit():
print("Form Valid")
return render_template("register.html", form=form)
</code></pre>