Validation 代码体系结构-Flask-从数据库将表单验证放在何处?

Validation 代码体系结构-Flask-从数据库将表单验证放在何处?,validation,flask,architecture,wtforms,web-architecture,Validation,Flask,Architecture,Wtforms,Web Architecture,我想知道我应该把访问数据库的验证表单放在哪里。 基本上,我需要用户输入项目类型,我想首先检查数据库中是否存在项目类型 有3种选择: 在数据库模型中,我有ItemType类,我放置了函数add(),它将检查现有项是否存在 在视图中,因此在页面的路径中,从wtformsform.validate\u on_submit(),我进行检查以从数据库获取数据,如果存在,我将在此处输入错误 在wtformsvalidate()中,在表单类的默认验证之后添加额外的验证 我见过有人用数字2和3,但不确定哪一个是

我想知道我应该把访问数据库的验证表单放在哪里。 基本上,我需要用户输入
项目类型
,我想首先检查数据库中是否存在
项目类型

有3种选择:

  • 在数据库模型中,我有
    ItemType
    类,我放置了函数
    add()
    ,它将检查现有项是否存在

  • 在视图中,因此在页面的路径中,从wtforms
    form.validate\u on_submit()
    ,我进行检查以从数据库获取数据,如果存在,我将在此处输入错误

  • 在wtforms
    validate()
    中,在
    表单
    类的默认验证之后添加额外的验证


  • 我见过有人用数字2和3,但不确定哪一个是最好的。我想要的错误消息也需要显示在表单的特定字段上(这可以通过方法2和3实现,因为它们引用了表单字段),但同样,由于它与访问数据库有关,也许最好将有关数据库访问的所有信息都放在模型函数上?

    ,如果它来自表单,则应在该表单上验证它,然后在无效时为该特定字段引发错误。请参见下面的示例:

    class SigninForm(Form):
        """Form for signin"""
        email = StringField('Email',
                            validators=[
                                DataRequired("Email shouldn't be empty."),
                                Email('Email format is not correct.')
                            ])
    
        password = PasswordField('Password',
                                 validators=[DataRequired("Password shouldn't be empty.")])
    
        def validate_email(self, field):
            """ 
                verify if account exists and if not raise an error in
                that field. 
            """
            user = User.query.filter(User.email == self.email.data).first()
            if not user:
                raise ValueError("Account doesn't exist.")
    
        def validate_password(self, field):
            """ 
                Verify if password is valid and if not raise an error in
                that field. 
            """
            if self.email.data:
                user = User.query.filter(User.email == self.email.data).first()
                if not user or not user.check_password(self.password.data):
                    raise ValueError('Password is not correct.')
                else:
                    self.user = user
    
    此示例的视图函数:

    @app.route('/signin', methods=['GET', 'POST'])
    def signin():
        """Signin"""
        form = SigninForm()
        if form.validate_on_submit():
            # sign in function to register user into a session
            signin_user(form.user)
            return redirect(url_for('site.index'))
        return render_template('account/signin/signin.html', form=form)
    

    如果您没有将
    validate_电子邮件
    validate_密码
    作为自定义验证器传递到各个字段构造函数中,那么如何/何时调用它们?您的方法命名加上继承WTForm是否会自动神奇地发生某些事情?