コンテンツにスキップ

Network Types

ネットワークモジュールには、一般的なネットワーク関連フィールドのタイプが含まれています。

AnyUrl module-attribute

AnyUrl = Url

すべてのURLの基本タイプ。

  • 任意のスキームを使用可能です。
  • トップレベルドメイン(TLD)は不要です。
  • ホストは必要です。

入力URLがhttp://samuel:pass@example.com:8000/the/path/?query=here#fragment=is;this=bitの場合、型は次のプロパティをエクスポートします。

-scheme: URLスキーム(http)が常に設定されます。 -host: URLホスト(example.com)で、常に設定されます。 -username: オプションのユーザ名(samuel)がある場合。 -password: オプションのパスワード(pass)がある場合。 -port: オプションのポート(8000)です。 -path: オプションのパス(/the/path/)。 -query: オプションのURLクエリ(例えばGET引数やquery=hereのような"search string")。 -fragment: オプションのfragment(fragment=is;this=bit)。

AnyHttpUrl module-attribute

AnyHttpUrl = Annotated[
    Url, UrlConstraints(allowed_schemes=["http", "https"])
]

任意のhttpまたはhttps URLを受け入れるタイプ。

  • TLDは不要です。
  • ホストが必要です。

HttpUrl module-attribute

HttpUrl = Annotated[
    Url,
    UrlConstraints(
        max_length=2083, allowed_schemes=["http", "https"]
    ),
]

任意のhttpまたはhttps URLを受け入れるタイプ。

  • TLDは不要です。
  • ホストが必要です。
  • 最大長2083です。
from pydantic import BaseModel, HttpUrl, ValidationError

class MyModel(BaseModel):
    url: HttpUrl

m = MyModel(url='http://www.example.com')  # (1)!
print(m.url)
#> http://www.example.com/

try:
    MyModel(url='ftp://invalid.url')
except ValidationError as e:
    print(e)
    '''
    1 validation error for MyModel
    url
      URL scheme should be 'http' or 'https' [type=url_scheme, input_value='ftp://invalid.url', input_type=str]
    '''

try:
    MyModel(url='not a url')
except ValidationError as e:
    print(e)
    '''
    1 validation error for MyModel
    url
      Input should be a valid URL, relative URL without a base [type=url_parsing, input_value='not a url', input_type=str]
    '''
  1. 注意:mypyはm=MyModel(url=HttpUrl('http://www.example.com'))を好みますが、いずれにせよPydanticは文字列をHttpUrlインスタンスに変換します。

「International domains」(たとえば、ホストまたはTLDに非ASCII文字が含まれるURL)は、punycodeによってエンコードされます(これが重要である理由の適切な説明については、this articleを参照してください)。

from pydantic import BaseModel, HttpUrl

class MyModel(BaseModel):
    url: HttpUrl

m1 = MyModel(url='http://puny£code.com')
print(m1.url)
#> http://xn--punycode-eja.com/
m2 = MyModel(url='https://www.аррӏе.com/')
print(m2.url)
#> https://www.xn--80ak6aa92e.com/
m3 = MyModel(url='https://www.example.珠宝/')
print(m3.url)
#> https://www.example.xn--pbt977c/

Underscores in Hostnames

Pydanticでは、TLDを除くドメインのすべての部分でアンダースコアを使用できます。 技術的には、これは間違っている可能性があります。理論的には、ホスト名にアンダースコアを付けることはできませんが、サブドメインにはアンダースコアを付けることができます。

これを説明するために、次の2つのケースを考えてみましょう。

  • exam_ple.co.uk:ホスト名はexam_pleですが、アンダースコアが含まれているため許可されません。
  • foo_bar.example.comホスト名はexampleです。アンダースコアはサブドメインにあるので、これは許可されるべきです。

TLDの網羅的なリストがなければ、これら2つを区別することは不可能であろう。したがって、アンダースコアは使用できますが、必要に応じていつでもバリデータでさらに検証を行うことができます。

また、Chrome、Firefox、Safariは現在、URLとしてhttp://exam_ple.comを受け入れているので、私たちは良い(あるいは少なくとも大きな)会社にいます。

AnyWebsocketUrl module-attribute

AnyWebsocketUrl = Annotated[
    Url, UrlConstraints(allowed_schemes=["ws", "wss"])
]

任意のwsまたはwss URLを受け入れるタイプ。

  • TLDは不要です。
  • ホストが必要です。

WebsocketUrl module-attribute

WebsocketUrl = Annotated[
    Url,
    UrlConstraints(
        max_length=2083, allowed_schemes=["ws", "wss"]
    ),
]

任意のwsまたはwss URLを受け入れるタイプ。

  • TLDは不要です。
  • ホストが必要です。
  • 最大長2083です。

FileUrl module-attribute

FileUrl = Annotated[
    Url, UrlConstraints(allowed_schemes=["file"])
]

任意のファイルURLを受け入れるタイプ。

  • ホストは不要です。

FtpUrl module-attribute

FtpUrl = Annotated[
    Url, UrlConstraints(allowed_schemes=["ftp"])
]

ftp URLを受け入れるタイプ。

  • TLDは不要です。
  • ホストが必要です。

PostgresDsn module-attribute

PostgresDsn = Annotated[
    MultiHostUrl,
    UrlConstraints(
        host_required=True,
        allowed_schemes=[
            "postgres",
            "postgresql",
            "postgresql+asyncpg",
            "postgresql+pg8000",
            "postgresql+psycopg",
            "postgresql+psycopg2",
            "postgresql+psycopg2cffi",
            "postgresql+py-postgresql",
            "postgresql+pygresql",
        ],
    ),
]

任意のPostgres DSNを受け入れるタイプ。

  • ユーザー情報が必要です。
  • TLDは不要です。
  • ホストが必要です。
  • 複数のホストをサポート

さらに検証が必要な場合は、これらのプロパティをバリデータで使用して、特定の動作を強制できます。

from pydantic import (
    BaseModel,
    HttpUrl,
    PostgresDsn,
    ValidationError,
    field_validator,
)

class MyModel(BaseModel):
    url: HttpUrl

m = MyModel(url='http://www.example.com')

# the repr() method for a url will display all properties of the url
print(repr(m.url))
#> Url('http://www.example.com/')
print(m.url.scheme)
#> http
print(m.url.host)
#> www.example.com
print(m.url.port)
#> 80

class MyDatabaseModel(BaseModel):
    db: PostgresDsn

    @field_validator('db')
    def check_db_name(cls, v):
        assert v.path and len(v.path) > 1, 'database must be provided'
        return v

m = MyDatabaseModel(db='postgres://user:pass@localhost:5432/foobar')
print(m.db)
#> postgres://user:pass@localhost:5432/foobar

try:
    MyDatabaseModel(db='postgres://user:pass@localhost:5432')
except ValidationError as e:
    print(e)
    '''
    1 validation error for MyDatabaseModel
    db
      Assertion failed, database must be provided
    assert (None)
     +  where None = MultiHostUrl('postgres://user:pass@localhost:5432').path [type=assertion_error, input_value='postgres://user:pass@localhost:5432', input_type=str]
    '''

CockroachDsn module-attribute

CockroachDsn = Annotated[
    Url,
    UrlConstraints(
        host_required=True,
        allowed_schemes=[
            "cockroachdb",
            "cockroachdb+psycopg2",
            "cockroachdb+asyncpg",
        ],
    ),
]

任意のCockroach DSNを受け入れるタイプ。

  • ユーザー情報が必要です。
  • TLDは不要です。
  • ホストが必要です。

AmqpDsn module-attribute

AmqpDsn = Annotated[
    Url, UrlConstraints(allowed_schemes=["amqp", "amqps"])
]

任意のAMQP DSNを受け入れるタイプ。

  • ユーザー情報が必要です。
  • TLDは不要です。
  • ホストが必要です。

RedisDsn module-attribute

RedisDsn = Annotated[
    Url,
    UrlConstraints(
        allowed_schemes=["redis", "rediss"],
        default_host="localhost",
        default_port=6379,
        default_path="/0",
    ),
]

任意のRedis DSNを受け入れるタイプ。

  • ユーザー情報が必要です。
  • TLDは不要です。
  • ホストが必要です。(例:rediss://:pass@localhost)

MongoDsn module-attribute

MongoDsn = Annotated[
    MultiHostUrl,
    UrlConstraints(
        allowed_schemes=["mongodb", "mongodb+srv"],
        default_port=27017,
    ),
]

任意のMongoDB DSNを受け入れる型。

  • ユーザー情報は必要ありません
  • データベース名は必要ありません
  • ポートは不要です。
  • ユーザ情報はユーザパートなしで渡すことができます(例:mongodb://mongodb0.example.com:27017)。

KafkaDsn module-attribute

KafkaDsn = Annotated[
    Url,
    UrlConstraints(
        allowed_schemes=["kafka"],
        default_host="localhost",
        default_port=9092,
    ),
]

任意のKafka DSNを受け入れるタイプ。

  • ユーザー情報が必要です。
  • TLDは不要です。
  • ホストが必要です。

NatsDsn module-attribute

NatsDsn = Annotated[
    MultiHostUrl,
    UrlConstraints(
        allowed_schemes=["nats", "tls", "ws"],
        default_host="localhost",
        default_port=4222,
    ),
]

任意のNATS DSNを受け入れるタイプ。

NATSは、ますます高度に接続される世界のために構築された接続技術です。 これは、オンプレミス、エッジ、ウェブとモバイル、デバイスなど、クラウドベンダーのあらゆる組み合わせにわたって、アプリケーションが安全に通信できるようにする単一のテクノロジーです。 詳細:https://nats.io

MySQLDsn module-attribute

MySQLDsn = Annotated[
    Url,
    UrlConstraints(
        allowed_schemes=[
            "mysql",
            "mysql+mysqlconnector",
            "mysql+aiomysql",
            "mysql+asyncmy",
            "mysql+mysqldb",
            "mysql+pymysql",
            "mysql+cymysql",
            "mysql+pyodbc",
        ],
        default_port=3306,
    ),
]

任意のMySQL DSNを受け入れるタイプ。

  • ユーザー情報が必要です。。
  • TLDは不要です。
  • ホストが必要です。

MariaDBDsn module-attribute

MariaDBDsn = Annotated[
    Url,
    UrlConstraints(
        allowed_schemes=[
            "mariadb",
            "mariadb+mariadbconnector",
            "mariadb+pymysql",
        ],
        default_port=3306,
    ),
]

任意のMariaDB DSNを受け入れるタイプ。

  • ユーザー情報が必要です。
  • TLDは不要です。
  • ホストが必要です。

ClickHouseDsn module-attribute

ClickHouseDsn = Annotated[
    Url,
    UrlConstraints(
        allowed_schemes=[
            "clickhouse+native",
            "clickhouse+asynch",
        ],
        default_host="localhost",
        default_port=9000,
    ),
]

A type that will accept any ClickHouse DSN.

  • ユーザー情報が必要です。
  • TLDは不要です。
  • ホストが必要です。

MAX_EMAIL_LENGTH module-attribute

MAX_EMAIL_LENGTH = 2048

電子メールの最大長。 ほとんどの実装で許可されている数と比較して、多少任意ですが非常に寛大な数です。

UrlConstraints dataclass

UrlConstraints(
    max_length: int | None = None,
    allowed_schemes: list[str] | None = None,
    host_required: bool | None = None,
    default_host: str | None = None,
    default_port: int | None = None,
    default_path: str | None = None,
)

Bases: PydanticMetadata

URLの制約。

Attributes:

Name Type Description
max_length int | None

URLの最大長。デフォルトはNoneです。

allowed_schemes list[str] | None

許可されたスキーマ。デフォルトはNoneです。

host_required bool | None

ホストが必要です。かどうか。デフォルトはNoneです。

default_host str | None

デフォルトのホスト。デフォルトはNoneです。

default_port int | None

デフォルトのポート。デフォルトはNoneです。

default_path str | None

デフォルトのパス。デフォルトはNoneです。

EmailStr

Info

このタイプを使用するには、オプションのemail-validatorパッケージをインストールする必要があります。

pip install email-validator

電子メールアドレスを検証します。

from pydantic import BaseModel, EmailStr

class Model(BaseModel):
    email: EmailStr

print(Model(email='contact@mail.com'))
#> email='contact@mail.com'

NameEmail

NameEmail(name: str, email: str)

Bases: Representation

Info

このタイプを使用するには、オプションのemail-validatorパッケージをインストールする必要があります。

pip install email-validator

RFC 5322で指定されているように、名前と電子メールアドレスの組み合わせを検証します。

NameEmailにはnameemailという2つの属性があります。 nameが指定されていない場合は、メールアドレスから推測されます。

from pydantic import BaseModel, NameEmail

class User(BaseModel):
    email: NameEmail

user = User(email='Fred Bloggs <fred.bloggs@example.com>')
print(user.email)
#> Fred Bloggs <fred.bloggs@example.com>
print(user.email.name)
#> Fred Bloggs

user = User(email='fred.bloggs@example.com')
print(user.email)
#> fred.bloggs <fred.bloggs@example.com>
print(user.email.name)
#> fred.bloggs
Source code in pydantic/networks.py
489
490
491
def __init__(self, name: str, email: str):
    self.name = name
    self.email = email

IPvAnyAddress

IPv4またはIPv6アドレスを検証します。

from pydantic import BaseModel
from pydantic.networks import IPvAnyAddress

class IpModel(BaseModel):
    ip: IPvAnyAddress

print(IpModel(ip='127.0.0.1'))
#> ip=IPv4Address('127.0.0.1')

try:
    IpModel(ip='http://www.example.com')
except ValueError as e:
    print(e.errors())
    '''
    [
        {
            'type': 'ip_any_address',
            'loc': ('ip',),
            'msg': 'value is not a valid IPv4 or IPv6 address',
            'input': 'http://www.example.com',
        }
    ]
    '''

IPvAnyInterface

IPv4またはIPv6インターフェイスを検証します。

IPvAnyNetwork

IPv4またはIPv6ネットワークを検証します。

validate_email

validate_email(value: str) -> tuple[str, str]

email-validatorを使用した電子メールアドレスの検証。

Note

Note that:

  • 生のIPアドレス(リテラル)ドメイン部分は許可されません。
  • "John Doe<local_part@domain.com>"スタイルの"pretty"電子メールアドレスが処理されます。
  • スペースはアドレスの先頭と末尾からストライプされますが、エラーは発生しません。
Source code in pydantic/networks.py
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
def validate_email(value: str) -> tuple[str, str]:
    """[email-validator](https://pypi.org/project/email-validator/)を使用した電子メールアドレスの検証。

    Note:
        Note that:

        * 生のIPアドレス(リテラル)ドメイン部分は許可されません。
        * `"John Doe<local_part@domain.com>"`スタイルの"pretty"電子メールアドレスが処理されます。
        * スペースはアドレスの先頭と末尾からストライプされますが、エラーは発生しません。


    """
    if email_validator is None:
        import_email_validator()

    if len(value) > MAX_EMAIL_LENGTH:
        raise PydanticCustomError(
            'value_error',
            'value is not a valid email address: {reason}',
            {'reason': f'Length must not exceed {MAX_EMAIL_LENGTH} characters'},
        )

    m = pretty_email_regex.fullmatch(value)
    name: str | None = None
    if m:
        unquoted_name, quoted_name, value = m.groups()
        name = unquoted_name or quoted_name

    email = value.strip()

    try:
        parts = email_validator.validate_email(email, check_deliverability=False)
    except email_validator.EmailNotValidError as e:
        raise PydanticCustomError(
            'value_error', 'value is not a valid email address: {reason}', {'reason': str(e.args[0])}
        ) from e

    email = parts.normalized
    assert email is not None
    name = name or parts.local_part
    return name, email