自定义验证程序不工作

2024-10-02 02:40:23 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我试图在我的Flask应用程序中实现自定义验证器,但遇到了一个问题。我为RegisterForm编写的自定义验证器UniqueRequired()似乎正在工作,但我的LoginForm验证器似乎根本没有被调用,ValidUsername()中的print语句没有打印。我已经尝试过将验证器放在同一个文件中,在不同的语句中导入它们,并更改验证器的顺序,但是没有任何效果

这是我的forms.py文件:

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")

My validators.py文件:

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")

以及我的/登录和/注册路径:

@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)

Tags: fromimportformidfieldifdefusername
2条回答

我可以想出两种可能的解决方案
首先:我认为在验证器列表中的自定义验证器后面应该有一组括号

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")

Second:您可以为表单类中的每个类成员创建单独的方法。
当调用“提交时验证”时,将自动调用它们。
你可以这样做

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired, Length, EqualTo

class LoginForm(FlaskForm):
    username = StringField("Username:", validators=[DataRequired()], id="username")
    password = PasswordField("Password:", validators=[DataRequired(), ValidPassword], id="password")
 # validate_<fieldname>  method will automatically validate
    def validate_username(self,field):
    user = User.query.filter_by(username=field.data).first()
    # print(user)
    if not user:
        raise ValidationError("Invalid Username")

    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")

我已经给出了LoginForm中唯一用户名字段的示例,如您所见,您也可以对其他字段执行类似操作。

好吧,我一直在四处寻找,我发现了问题所在。在我的/登录路径中,我在提交时使用了form.validate\u,但没有添加任何括号。更正后的代码如下所示:

@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)

相关问题 更多 >

    热门问题