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

如何标记Pydantic模型字段为机密类型以避免敏感信息泄露?

Pydantic机密字段标记方案

Pydantic本身原生支持字段级的隐藏、排除配置,不需要额外开发即可实现机密字段的防泄露机制,不同版本的实现方式如下:

Pydantic V2 方案

V2版本直接通过Field的两个参数即可实现需求:

  • repr=False:禁止字段出现在__repr__、__str__的输出结果中,打印模型实例时不会泄露
  • exclude=True:调用model_dump()(原dict()方法)转字典时默认排除该字段

示例代码:

from pydantic import BaseModel, Field

class User(BaseModel):
    name: str
    # 标记为机密字段
    password_hash: str = Field(repr=False, exclude=True)

效果验证:

user = User(name="张三", password_hash="e10adc3949ba59abbe56e057f20f883e")

# 打印/字符串输出无机密字段
print(user)  # 输出:User(name='张三')
print(repr(user))  # 输出:User(name='张三')

# 转字典默认排除机密字段
print(user.model_dump())  # 输出:{'name': '张三'}

如果有特殊场景需要临时导出包含机密字段的内容,可以手动覆盖默认配置:

# 临时导出所有字段
print(user.model_dump(exclude=None))
# 输出:{'name': '张三', 'password_hash': 'e10adc3949ba59abbe56e057f20f883e'}

Pydantic V1 方案

V1版本的参数逻辑和V2一致,仅转字典的方法名为dict():

from pydantic import BaseModel, Field

class User(BaseModel):
    name: str
    password_hash: str = Field(repr=False, exclude=True)

user = User(name="张三", password_hash="e10adc3949ba59abbe56e057f20f883e")
print(user)  # 输出:User(name='张三')
print(user.dict())  # 输出:{'name': '张三'}

# 临时导出所有字段
print(user.dict(exclude=None))

额外安全增强

如果需要彻底杜绝机密字段被序列化泄露,可以额外增加序列化钩子,即使误开导出也只会返回占位符:

from pydantic import BaseModel, Field, field_serializer

class User(BaseModel):
    name: str
    password_hash: str = Field(repr=False, exclude=True)

    @field_serializer("password_hash")
    def mask_secret(self, value: str) -> str:
        return "***"

内容的提问来源于stack exchange,提问作者יהוידע שטינמץ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:39:04