【问题标题】:Override Default WTF forms validation for FlaskAdmin with SQLAlchemy使用 SQLAlchemy 覆盖 FlaskAdmin 的默认 WTF 表单验证
【发布时间】:2017-04-28 14:57:24
【问题描述】:

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

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

请告诉我如何防止这种情况发生。见下方相关代码sn-p:

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
 ...
 ...

【问题讨论】:

    标签: python flask-sqlalchemy wtforms flask-wtforms flask-admin


    【解决方案1】:

    如果您的正则表达式匹配,您需要提高 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  ...
    

    【讨论】:

    • 该死……真的就这么简单吗?如果可行,我会尝试并将其标记为最佳答案!我查看了一些文档,似乎没有遇到 StopValidation()。你在哪里读到的?文档或一些教程?
    • @JayjayJay 在docs
    猜你喜欢
    • 2019-05-22
    • 1970-01-01
    • 2019-09-13
    • 2020-01-17
    • 2010-10-30
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多