Ga naar inhoud

Geheimen

!!! waarschuwing "🚧 Work in Progress" Deze pagina is work in progress.

Serialiseer SecretStr en SecretBytes als platte tekst

Standaard worden SecretStr en SecretBytes geserialiseerd als ********** bij serialisatie naar json.

U kunt de field_serializer gebruiken om het geheim als platte tekst te dumpen bij het serialiseren naar json.

from pydantic import BaseModel, SecretBytes, SecretStr, field_serializer


class Model(BaseModel):
    password: SecretStr
    password_bytes: SecretBytes

    @field_serializer('password', 'password_bytes', when_used='json')
    def dump_secret(self, v):
        return v.get_secret_value()


model = Model(password='IAmSensitive', password_bytes=b'IAmSensitiveBytes')
print(model)
#> password=SecretStr('**********') password_bytes=SecretBytes(b'**********')
print(model.password)
#> **********
print(model.model_dump())
"""
{
    'password': SecretStr('**********'),
    'password_bytes': SecretBytes(b'**********'),
}
"""
print(model.model_dump_json())
#> {"password":"IAmSensitive","password_bytes":"IAmSensitiveBytes"}

Maak uw eigen geheime veld

Pydantic biedt de generieke klasse Secret als een mechanisme voor het maken van aangepaste geheimtypen.

??? api "API-documentatie" pydantic.types.Secret

Pydantic biedt de generieke klasse Secret als een mechanisme voor het maken van aangepaste geheimtypen. U kunt Secret direct parametriseren, of een subklasse van een geparametriseerd Secret maken om de str() en repr() van een geheimtype aan te passen.

from datetime import date

from pydantic import BaseModel, Secret

# Using the default representation
SecretDate = Secret[date]


# Overwriting the representation
class SecretSalary(Secret[float]):
    def _display(self) -> str:
        return '$****.**'


class Employee(BaseModel):
    date_of_birth: SecretDate
    salary: SecretSalary


employee = Employee(date_of_birth='1990-01-01', salary=42)

print(employee)
#> date_of_birth=Secret('**********') salary=SecretSalary('$****.**')

print(employee.salary)
#> $****.**

print(employee.salary.get_secret_value())
#> 42.0

print(employee.date_of_birth)
#> **********

print(employee.date_of_birth.get_secret_value())
#> 1990-01-01

U kunt beperkingen opleggen aan het onderliggende type via annotaties: Bijvoorbeeld:

from typing_extensions import Annotated

from pydantic import BaseModel, Field, Secret, ValidationError

SecretPosInt = Secret[Annotated[int, Field(gt=0, strict=True)]]


class Model(BaseModel):
    sensitive_int: SecretPosInt


m = Model(sensitive_int=42)
print(m.model_dump())
#> {'sensitive_int': Secret('**********')}

try:
    m = Model(sensitive_int=-42)  # (1)!
except ValidationError as exc_info:
    print(exc_info.errors(include_url=False, include_input=False))
    """
    [
        {
            'type': 'greater_than',
            'loc': ('sensitive_int',),
            'msg': 'Input should be greater than 0',
            'ctx': {'gt': 0},
        }
    ]
    """

try:
    m = Model(sensitive_int='42')  # (2)!
except ValidationError as exc_info:
    print(exc_info.errors(include_url=False, include_input=False))
    """
    [
        {
            'type': 'int_type',
            'loc': ('sensitive_int',),
            'msg': 'Input should be a valid integer',
        }
    ]
    """
  1. De invoerwaarde is niet groter dan 0, waardoor er een validatiefout ontstaat.
  2. De invoerwaarde is geen geheel getal, dus er ontstaat een validatiefout omdat voor het SecretPosInt -type de strikte modus is ingeschakeld.

本文总阅读量