如何在Python Pydantic中对Host主机字段进行合规校验?
Pydantic Host字段校验实现方案
方案1:内置类型组合(开箱即用,推荐)
Pydantic v2 原生内置类型已经覆盖所有要求的Host格式,直接通过Union组合即可完成校验,无需额外开发逻辑:
IPvAnyAddress类型覆盖IPv4、IPv6地址校验Domain类型默认支持国际化域名(IDN)、普通域名、带IP前缀的域名(数字开头的子域符合RFC域名规范,可被正常识别)
代码示例:
from pydantic import BaseModel, IPvAnyAddress, Domain from typing import Union class RequestModel(BaseModel): host: Union[IPvAnyAddress, Domain] # 所有示例场景均可通过校验 test_hosts = [ "127.0.0.1", "2001:db8:ff00:42", "example.com", "puny£code.com", "11.11.101.11.example.org" ] for host in test_hosts: instance = RequestModel(host=host) print(f"校验通过:{instance.host}")
方案2:自定义校验器(灵活适配业务规则)
如果需要额外添加自定义限制(比如禁止私有IP、限制域名后缀等),可以通过@field_validator实现自定义校验逻辑:
from pydantic import BaseModel, field_validator import ipaddress import idna class RequestModel(BaseModel): host: str @field_validator("host") @classmethod def validate_host(cls, value: str) -> str: # 校验是否为合法IP地址 try: ipaddress.ip_address(value) return value except ValueError: pass # 校验是否为合法域名(支持国际化域名) try: # 国际化域名punycode编码校验 idna.encode(value) # 域名通用规则校验 if len(value) > 253: raise ValueError("域名总长度不能超过253个字符") domain_segments = value.split(".") for seg in domain_segments: if not seg or len(seg) > 63: raise ValueError("域名分段长度不符合规范") return value except Exception: raise ValueError(f"非法Host格式:{value}")
内容的提问来源于stack exchange,提问作者Vivek Kumar
相关产品推荐
相关产品推荐

