You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flask-Smorest+Marshmallow中预定义可复用验证器?

复用Marshmallow内置验证器的方案

针对多个API端点重复使用相同验证逻辑的问题,你可以通过以下几种方式复用Marshmallow的内置验证器,避免重复代码:

方案1:定义模块级别的验证器实例

直接把常用的验证器实例定义在模块顶层,多个Schema字段都可以引用它:

from marshmallow import Schema, fields, validate

# 定义可复用的正则验证器实例
REQUEST_NUMBER_VALIDATOR = validate.Regexp(
    regex=r"^REQUEST\d{3,9}$",
    error="Input string didn't match required format - REQUEST12345"
)

class api1():
    class input1(Schema):
        request_number = fields.Str(
            metadata={'description': 'Request Number', 'example':'REQUEST12345'},
            validate=REQUEST_NUMBER_VALIDATOR
        )
        
class api2():
    class input1(Schema):
        request_number = fields.Str(
            metadata={'description': 'Request Number', 'example':'REQUEST12345'},
            validate=REQUEST_NUMBER_VALIDATOR
        )

方案2:复用完整字段

如果字段的元数据、验证器都完全相同,可以直接定义可复用的字段变量:

from marshmallow import Schema, fields, validate

# 定义可复用的request_number字段
REQUEST_NUMBER_FIELD = fields.Str(
    metadata={'description': 'Request Number', 'example':'REQUEST12345'},
    validate=validate.Regexp(
        regex=r"^REQUEST\d{3,9}$",
        error="Input string didn't match required format - REQUEST12345"
    )
)

class api1():
    class input1(Schema):
        request_number = REQUEST_NUMBER_FIELD
        
class api2():
    class input1(Schema):
        request_number = REQUEST_NUMBER_FIELD

方案3:使用Schema继承

如果多个Schema共享多个字段,创建一个基础Schema,其他Schema继承它:

from marshmallow import Schema, fields, validate

class BaseRequestSchema(Schema):
    request_number = fields.Str(
        metadata={'description': 'Request Number', 'example':'REQUEST12345'},
        validate=validate.Regexp(
            regex=r"^REQUEST\d{3,9}$",
            error="Input string didn't match required format - REQUEST12345"
        )
    )

class api1():
    class input1(BaseRequestSchema):
        # 可在此添加当前API专属的其他字段
        pass
        
class api2():
    class input1(BaseRequestSchema):
        # 可在此添加当前API专属的其他字段
        pass

关于你之前尝试的问题

你之前的代码中,repetative_validators类里的request_number是类属性,不需要实例化类,直接用repetative_validators.request_number即可引用,不过相比之下,模块级变量或Schema继承的方式更简洁直观。

内容的提问来源于stack exchange,提问作者Stephan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 23:03:26