Python Api响应验证封装
基础验证基类
首先,我们创建一个继承自ABC类的BaseValidator类。因此,我可以创建一个抽象方法。从此类继承的所有类都必须实现验证功能。
其中有三个魔法函数,__set__()函数在为对象赋值时,自动传入并执行。
from abc import ABC, abstractmethod class BaseValidator(ABC): @abstractmethod def validate(self, value): pass def __init__(self): self.value = None def __get__(self, obj, objtype): return self.value def __set__(self,obj, value): self.validate(value) self.value = value
创建验证类
然后创建了3个验证示例类。String,Integer和OneOf类。
String类具有最小和最大长度。验证器功能检查新值是否在最小和最大长度之间。
Integer类具有一个最小参数。验证功能检查新值是否大于此最小参数。
OneOf类很特殊。它接收可能的(字符串)值列表。验证功能检查新值是否为可能的值之一。
class OneOf(BaseValidator): def __init__(self, values=list()): self.values = values def validate(self, value): if not isinstance(value, str): raise TypeError(f'{value} should be of type str') if not(value in self.values): raise ValueError(f'{value} should be one of {self.values}') class String(BaseValidator): def __init__(self, min_len = 8, max_len=12): self.min_len = min_len self.max_len = max_len def validate(self, value): if not isinstance(value, str): raise TypeError(f'{value} should be of type str') if len(value) < self.min_len: raise ValueError(f'length of {value} should be at least {self.min_len}') if len(value) > self.max_len: raise ValueError(f'length of {value} should be not bigger than {self.max_len}') class Integer(BaseValidator): def __init__(self, minimum=21): self.minimum = minimum def validate(self, value): if not isinstance(value, int): raise TypeError(f'{value} should be of type int') if value < self.minimum: raise ValueError(f'{value} should be at least {self.minimum}')
构建unittest测试
这里ReplyValidator和Reply写死了,在实际工作中,可以将验证类对象与数据一起传入Reply,在ReplyValidator中循环实例化对象,并以列表返回,再循环赋值验证。
import unittest class ReplyValidator(object): name = String() age = Integer() interest = OneOf(["testing", "programming", "agile"]) class Reply(): def __init__(self, data): self.validator = ReplyValidator() self.validator.name = data["name"] self.validator.age = data["age"] self.validator.interest = data["interest"] class BaiduTest(unittest.TestCase): def setUp(self): pass def test_baidu(self): reply_data = dict(name="test", street="testing street", age=34, interest="testing") reply = Reply(reply_data) def tearDown(self): pass if __name__ == "__main__": unittest.main()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2018-12-26 python的os模块总结
2018-12-26 python套接字解决tcp粘包问题