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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:36:04