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

标签 python forms validation flask flask-wtforms

让我从平常开始 - 我是 Python 和 Flask 的新手。在发布这个问题(我的第一个问题)之前,我已经花了数小时进行搜索和试验,不幸的是到目前为止没有运气。

我正在构建 Web 表单,用户可以在其中定义防火墙规则,这些规则随后会记录在数据库中。我正处于验证阶段,我在这里遇到了困难……希望有人能够帮助我。

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

class FirewallRule(Form)
    src_ip = StringField('Source IP')
    dst_ip = StringField('Destination IP')

我的验证要求是:

  1. 必须至少填写 1 个字段(两者都可以)
  2. 填写的字段必须包含有效的 IP 地址

wtforms.validators.IPAddress() 和自定义验证函数似乎是我的 friend ,但我正在努力寻找一种方法将它们连接在一起。

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

  1. 如果不是 (src_ip OR dst_ip);返回假
  2. 如果 src_ip 和 src_ip 不是有效的 IP 地址;返回假
  3. 如果 dst_ip 和 dst_ip 不是有效的 IP 地址;返回假
  4. 返回真值

显然,我想重新使用 IPAddress() [或通常的任何内置验证器],而不是自己编写。

我确信之前一定有人做过。不幸的是我找不到任何正确方向的指示。

提前致谢。

最佳答案

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

关于至少填写一个字段的部分我会使用自定义验证方法来完成,我认为没有任何库存验证器可以帮助解决这个问题。

所以它会是这样的:

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

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

关于python - Flask:对多个表单字段进行条件验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29703979/

相关文章:

Php sql,表单在页面加载时重新提交

html - 如何检查用户输入的值是否具有特定数字?

asp.net-mvc - MVC Entity Framework 验证以防止重复记录

c# - RequiredFieldValidator 验证禁用的文本框

python - Pandas merge_asof : incompatible merge keys [datetime64[ns, 美国/东部] 和 dtype ('<M8[ns]' )

python - 更新 SQLAlchemy 中的特定行

python - 在 sendgrid 中发送多封动态模板电子邮件时个性化字段错误

python - selenium-Python,如何单击注销图像按钮

jquery - Geb:如何从下拉列表中选择一个值?

java - 在 web.xml 中发现以元素 'display-name' 开头的无效内容