Как ограничить проверку URL-адресов Pydantic определенными хостами или веб-сайтами

В настоящее время я работаю с типом 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
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
150
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

То, что вы пытаетесь сделать, — это проверка данных. Это можно сделать с помощью валидатора поля или валидатора модели.

Посмотри на:

https://docs.pydantic.dev/latest/concepts/validators/#before-after-wrap-and-plain-validators

Лучше повторите здесь основные части или связанный контент. Покажите, как можно решить эту конкретную проблему. Ссылки могут измениться или сломаться, что сделает ваш ответ бесполезным. Вы можете отредактировать и улучшить свой ответ.

Friedrich 15.05.2024 10:18

Да, хороший момент, я просто подумал, что ОП было бы полезно прочитать некоторую официальную документацию и прочитать проработанные примеры.

Nikitas Nikandros 15.05.2024 23:44
Ответ принят как подходящий

Как вы уже упомянули, для этого нет встроенной поддержки. Здесь 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

Другие вопросы по теме

Как я могу сгенерировать UUID в подклассе Pydantic BaseModel?
Модель взаимоотношений для разных ролей пользователей: чего мне не хватает?
Как я могу реализовать несколько необязательных полей, но хотя бы одно из них является обязательным в MyPy или Pydantic?
Pydantic: как представить список объектов как dict (сериализовать список как dict)
Как настроить openapi-generator-cli для включения значений None для полей, допускающих значение NULL, в моделях Pydantic
Pydantic ConfigDict(use_enum_values=True) не оказывает никакого эффекта при предоставлении значения по умолчанию. Как я могу предоставить значения по умолчанию?
Как добавить и получить метаданные в pydantic поле
Проблема несовместимости типов с наследованием модели Pydantic и списком подклассов
Как использовать подклассы в вложенной модели Pydantic?
Как предотвратить повторное вычисление вычисляемых полей, которые зависят друг от друга?