Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Flask:对多个表单字段进行条件验证_Python_Forms_Validation_Flask_Flask Wtforms - Fatal编程技术网

Python Flask:对多个表单字段进行条件验证

Python Flask:对多个表单字段进行条件验证,python,forms,validation,flask,flask-wtforms,Python,Forms,Validation,Flask,Flask Wtforms,让我从平常开始——我对Python和Flask都是新手。在发布这个问题之前(我在这里的第一个问题),我花了几个小时搜索和实验,不幸的是到目前为止没有运气 我正在构建web表单,用户可以在其中定义防火墙规则,这些规则随后会记录在数据库中。我在验证阶段,我来到了一堵墙这里。。。希望有人能帮助我 我的(此处简化)表单有两个字段-src_ip和dst_ip: class FirewallRule(Form) src_ip = StringField('Source IP') dst_ip

让我从平常开始——我对Python和Flask都是新手。在发布这个问题之前(我在这里的第一个问题),我花了几个小时搜索和实验,不幸的是到目前为止没有运气

我正在构建web表单,用户可以在其中定义防火墙规则,这些规则随后会记录在数据库中。我在验证阶段,我来到了一堵墙这里。。。希望有人能帮助我

我的(此处简化)表单有两个字段-src_ip和dst_ip:

class FirewallRule(Form)
    src_ip = StringField('Source IP')
    dst_ip = StringField('Destination IP')
我的验证要求是:

  • 必须至少填写1个字段(两个都可以)
  • 填写的字段必须包含有效的IP地址
  • wtforms.validators.IPAddress()和自定义验证函数似乎是我的朋友,但我正在努力找到一种方法将它们连接在一起

    基本上,我正在尝试构建条件验证:

  • 如果不是(src_ip或dst_ip);返回错误
  • 如果src_ip和src_ip不是有效的ip地址;返回错误
  • 如果dst_ip和dst_ip不是有效的ip地址;返回错误
  • 返回真值
  • 显然,我想重新使用IPAddress()[或者通常使用任何内置的验证器],而不是编写自己的验证器

    我肯定以前一定有人做过。。不幸的是,我找不到任何指向正确方向的指针


    提前感谢。

    您缺少一个非常有用的验证器:。此验证器允许您说字段可以为空,但如果它不为空,则应使用其他验证器

    关于至少填写其中一个字段的部分,我会使用自定义验证方法,我认为没有任何股票验证器可以提供帮助

    所以应该是这样的:

    class FirewallRule(Form)
        src_ip = StringField('Source IP', validators=[Optional(), IPAddress()])
        dst_ip = StringField('Destination IP', validators=[Optional(), IPAddress()])
    
        def validate(self):
            if not super(FirewallRule, self).validate():
                return False
            if not self.src_ip.data and not self.dst_ip.data:
                msg = 'At least one of Source and Destination IP must be set'
                self.src_ip.errors.append(msg)
                self.dst_ip.errors.append(msg)
                return False
            return True
    

    如果您想避免自定义验证函数,那么请考虑创建一个ValueActer类来检查是否设置了一个字段列表中的至少一个是相当容易的。如果您愿意遵循这条路线,您可以查看验证程序的实现以获得灵感。

    您可以尝试重新加载表单的方法,并在需要时进行提升。@dizballanze这将使我确保至少有一个字段已填充,但我将无法使用验证程序验证输入非常感谢Miguel。我知道Optional(),但我不知道将它与另一个验证器绑定会有这样的效果-这很聪明!!谢谢米格尔的回答。它帮助了我。但我有一个问题。我有两个字段,StringField和BooleanField。应该选择其中一个。您的解决方案对我有效,但我无法将BooleanField设置为error(错误消息显示StringFeild没有问题,但BooleanField没有问题)。我的意思是我无法将错误附加到该字段。有解决办法吗?任何帮助都很好:)@Pradeepb您应该能够在任何字段上设置错误。您确定问题不在呈现复选框的方式上吗?为复选框呈现的HTML必须包含错误消息,就像文本字段一样。