В настоящее время я работаю с типом URL-адреса Pydantic для проверки URL-адресов в своем проекте Python. Однако похоже, что Pydantic в настоящее время не предоставляет для этого встроенного механизма. Итак, как лучше всего ограничить URL-адрес определенным списком хостов в Pydantic?
У меня есть pydantic модель под названием Media, которая имеет атрибут url. Я хочу, чтобы URL-адрес был ограничен определенными веб-сайтами или хостами».
from pydantic import BaseModel, AnyUrl
class Media(BaseModel):
url: AnyUrl # the url host should only be from x.com or y.com






То, что вы пытаетесь сделать, — это проверка данных. Это можно сделать с помощью валидатора поля или валидатора модели.
Посмотри на:
https://docs.pydantic.dev/latest/concepts/validators/#before-after-wrap-and-plain-validators
Да, хороший момент, я просто подумал, что ОП было бы полезно прочитать некоторую официальную документацию и прочитать проработанные примеры.
Как вы уже упомянули, для этого нет встроенной поддержки. Здесь AfterValidator может выполнить эту работу:
from typing import Annotated, TypeAlias
from pydantic import AfterValidator, AnyUrl, BaseModel
valid_hosts = {"www.google.com", "www.yahoo.com"}
def check_specific_hosts(url: AnyUrl) -> AnyUrl:
if url.host in valid_hosts:
return url
raise ValueError("It's not in the list of accepted hosts")
AcceptedUrl: TypeAlias = Annotated[AnyUrl, AfterValidator(check_specific_hosts)]
class Media(BaseModel):
url: AcceptedUrl
print(Media(url = "http://www.google.com"))
try:
print(Media(url = "http://www.facebook.com"))
except ValueError as e:
print(e)
выход:
url=Url('http://www.google.com/')
1 validation error for Media
url
Value error, It's not in the list of accepted hosts [type=value_error, input_value='http://www.facebook.com', input_type=str]
For further information visit https://errors.pydantic.dev/2.6/v/value_error
Лучше повторите здесь основные части или связанный контент. Покажите, как можно решить эту конкретную проблему. Ссылки могут измениться или сломаться, что сделает ваш ответ бесполезным. Вы можете отредактировать и улучшить свой ответ.