Flask:对多个表单字段进行条件验证
Flask: conditional validation on multiple form fields
让我从平常开始 - 我对 Python 和 Flask 都是新手。在发布这个问题(我的第一个问题)之前,我花了很多时间进行搜索和试验,不幸的是到目前为止没有运气。
我正在构建 Web 表单,用户可以在其中定义防火墙规则,这些规则随后会记录在数据库中。我正处于验证阶段,我在这里碰壁了......希望有人能够帮助我。
我的(此处简化)表单有 2 个字段 - 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); return错
- 如果 src_ip AND src_ip 不是有效的 IP 地址; return错
- 如果 dst_ip AND dst_ip 不是有效的 IP 地址; return错
- Return 正确
显然我想重新使用 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
如果您想避免使用自定义验证函数,那么考虑创建一个验证器 class 来检查是否至少设置了一个字段列表是相当容易的。如果您想遵循这条路线,可以查看 EqualTo 验证器的实现以获取灵感。
让我从平常开始 - 我对 Python 和 Flask 都是新手。在发布这个问题(我的第一个问题)之前,我花了很多时间进行搜索和试验,不幸的是到目前为止没有运气。
我正在构建 Web 表单,用户可以在其中定义防火墙规则,这些规则随后会记录在数据库中。我正处于验证阶段,我在这里碰壁了......希望有人能够帮助我。
我的(此处简化)表单有 2 个字段 - 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); return错
- 如果 src_ip AND src_ip 不是有效的 IP 地址; return错
- 如果 dst_ip AND dst_ip 不是有效的 IP 地址; return错
- Return 正确
显然我想重新使用 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
如果您想避免使用自定义验证函数,那么考虑创建一个验证器 class 来检查是否至少设置了一个字段列表是相当容易的。如果您想遵循这条路线,可以查看 EqualTo 验证器的实现以获取灵感。