如何在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
相关产品推荐
相关产品推荐

