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',
}
]
"""
- De invoerwaarde is niet groter dan 0, waardoor er een validatiefout ontstaat.
- De invoerwaarde is geen geheel getal, dus er ontstaat een validatiefout omdat voor het
SecretPosInt
-type de strikte modus is ingeschakeld.
本文总阅读量次