使用SQLAlchemy重写FlaskAdmin的默认WTF表单验证

2024-09-27 19:22:21 发布

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

看起来web应用程序仍在应用默认的WTF表单验证,我如何禁用它?基本上,子网字段正在执行我的自定义验证(请参见图1):

enter image description here

但是,它似乎也应用了默认验证(IP地址验证),我不希望它这样做:

enter image description here

请告诉我怎样才能防止这种情况。请参阅下面的相关代码片段:

from sqlalchemy.dialects.postgresql import INET
 ...
 ...
 ...
app = Flask(__name__)
 ...
 ...
db = SQLAlchemy(app)
 ...
 ...

class Ipac(db.Model):
    __tablename__ = "ipac"
    id = db.Column('id', db.Integer, primary_key=True)
    subnet = db.Column('subnet', INET)
    gateway = db.Column('gateway', INET)
    vrip = db.Column('vrip', INET)
    serverid = db.Column('serverid', db.Integer, db.ForeignKey('server.id'))

    def __str__(self):
        return self.subnet  
 ...
 ...

class IpacView(ModelView):
    def subnet_format(form, field):
        if not re.match(r'\b(([0-9]|[0-9]{2}|2[0-5]{2}|2[0-4][0-9]|1[0-9]{2})\.){3}([0-9]|[0-9]{2}|2[0-5]{2}|2[0-4][0-9]|1[0-9]{2})\/(3[0-2]|2[0-9]|1[0-9]|[0-9])\b', field.data):
            raise ValidationError("Must be a valid subnet format!")

    column_display_all_relations = True
    column_labels = dict(subnet='Subnet', gateway='Gateway', vrip='VR IP')
    column_searchable_list = ('subnet', 'vrip', 'gateway', 'server.hostname')

    form_args = dict(
        subnet=dict(validators=[subnet_format])
        )

    def is_accessible(self):
        return login.current_user.is_authenticated
 ...
 ...

Tags: selfidappformatdbdefcolumninteger
1条回答
网友
1楼 · 发布于 2024-09-27 19:22:21

如果regexp匹配,则需要引发StopValidation()方法。这将停止验证链中的任何进一步调用。在

from wtforms.validators import StopValidation

# ....

class IpacView(ModelView):

    def subnet_format(form, field):
        if not re.match(
                r'\b(([0-9]|[0-9]{2}|2[0-5]{2}|2[0-4][0-9]|1[0-9]{2})\.){3}([0-9]|[0-9]{2}|2[0-5]{2}|2[0-4][0-9]|1[0-9]{2})\/(3[0-2]|2[0-9]|1[0-9]|[0-9])\b',
                field.data):
            raise ValidationError("Must be a valid subnet format!")
        else:
            raise StopValidation()

    # etc  ...

相关问题 更多 >

    热门问题