> ## Documentation Index
> Fetch the complete documentation index at: https://docs.squarecloud.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Valide dados em Python com Pydantic

> Validação de dados em Python com Pydantic: BaseModel, dataclasses, modo estrito, modelos aninhados, EmailStr e pydantic-settings para validar o ambiente.

Este guia cobre a validação de dados com o pydantic, uma biblioteca Python cujo núcleo de validação (`pydantic-core`) é escrito em Rust. Os exemplos usam o pydantic v2. Você precisa do Python e da biblioteca pydantic:

```bash theme={"system"}
pip install pydantic
```

## Criando um modelo

* Primeiro, precisamos importar `pydantic.BaseModel` e fazer a nossa classe herdar dele para começar a validar. No nosso exemplo, vamos criar uma classe chamada
  `Person`, que terá um nome, uma idade e um e-mail.

```python theme={"system"}
from pydantic import BaseModel

class Person(BaseModel):
    name: str
    age: int
    email: str
```

* Com essa classe, ao instanciá-la, o pydantic vai validar se `name` e `email` são strings e se `age` é um inteiro.

### Usando o modelo

* Agora que a criamos, vamos instanciar a classe. Vamos criar um dicionário com os dados e desempacotá-lo na nossa classe.

```python theme={"system"}
data = {
    "name": "John",
    "age": 19,
    "email": "john@example.com"
}
person = Person(**data)
```

* O exemplo acima não gera nenhum erro, pois todos os **campos** têm o tipo correto. Por padrão, o pydantic também converte valores compatíveis: se `age` for a string `"19"`, ela vira o inteiro `19`. Agora vamos enviar dados errados para confirmar que a validação funciona.

```python theme={"system"}
data = {
    "name": "John",
    "age": "nineteen",
    "email": "john@example.com"
}
person = Person(**data)
```

* O exemplo acima gera um `ValidationError`, pois `age` precisa ser um **inteiro** e `"nineteen"` não pode ser convertido em um:

```text theme={"system"}
1 validation error for Person
age
  Input should be a valid integer, unable to parse string as an integer [type=int_parsing, input_value='nineteen', input_type=str]
```

* Para tratar o erro em vez de deixá-lo parar o seu programa, capture-o com `try`/`except`. O método `errors()` lista cada campo inválido:

```python theme={"system"}
from pydantic import ValidationError

try:
    Person(name="John", age="nineteen", email="john@example.com")
except ValidationError as error:
    for item in error.errors():
        print(item["loc"], item["msg"])
# ('age',) Input should be a valid integer, unable to parse string as an integer
```

### Modo estrito

* Se você quiser rejeitar também strings como `"19"`, ative o modo estrito no modelo. Assim, `age` só aceita um `int` de verdade, e `Person(name="John", age="19", email="john@example.com")` gera `ValidationError`.

```python theme={"system"}
from pydantic import BaseModel, ConfigDict

class Person(BaseModel):
    model_config = ConfigDict(strict=True)

    name: str
    age: int
    email: str
```

## Criando uma dataclass

* Você também pode criar **dataclasses** com o pydantic. Elas são parecidas com as **dataclasses** padrão do Python, mas validam os campos como o `BaseModel`.

```python theme={"system"}
from pydantic.dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int
    email: str
```

* Se enviarmos a string `"19"` para `age`, ela será convertida para o `int` `19`.

<Info>
  O Pydantic suporta validação recursiva: ao validar modelos aninhados, ele também valida os modelos
  internos.

  Se uma classe tiver uma lista de `Person`, `people: list[Person]`, o pydantic verifica cada item da lista e o converte em um `Person`.
</Info>

## Extras

* O Pydantic tem alguns extras, como a validação de **e-mail** e um pacote de fallback de **timezone**. Para instalá-los, execute os comandos abaixo:

```bash theme={"system"}
pip install "pydantic[email]"
```

```bash theme={"system"}
pip install "pydantic[timezone]"
```

* Você pode instalar os dois de uma vez com o seguinte comando.

```bash theme={"system"}
pip install "pydantic[email,timezone]"
```

* O `pydantic[email]` adiciona o tipo `EmailStr`, que valida o formato `user@domain.tld` e normaliza o endereço.

```python theme={"system"}
from pydantic import EmailStr
from pydantic.dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int
    email: EmailStr
```

## Validando variáveis de ambiente na inicialização

* Bots e APIs leem tokens e configurações de variáveis de ambiente. Com o `pydantic-settings`, uma variável faltando ou inválida para a aplicação na inicialização com um erro claro, em vez de falhar mais tarde no meio de uma requisição.

```bash theme={"system"}
pip install pydantic-settings
```

* Declare as variáveis de que a sua aplicação precisa em uma classe que herda de `BaseSettings`. Cada campo lê a variável de ambiente de mesmo nome, sem diferenciar maiúsculas de minúsculas: `discord_token` lê `DISCORD_TOKEN`.

```python settings.py theme={"system"}
from pydantic import SecretStr
from pydantic_settings import BaseSettings


class Settings(BaseSettings):
    discord_token: SecretStr  # obrigatória: a aplicação não inicia sem ela
    port: int = 80  # opcional: 80 quando PORT não está definida
    debug: bool = False


settings = Settings()
```

* Se `DISCORD_TOKEN` não estiver definida, `Settings()` gera um `ValidationError` para `discord_token` com a mensagem `Field required`. Um valor como `PORT=abc` falha da mesma forma, porque `port` precisa ser um inteiro.
* O `SecretStr` esconde o token quando você imprime ou registra as configurações nos logs. Leia o valor real com `settings.discord_token.get_secret_value()`.

## Rode na Square Cloud

Liste o pydantic e os extras dele no seu `requirements.txt`, para que a Square Cloud os instale durante o deploy:

```txt requirements.txt theme={"system"}
pydantic[email]
pydantic-settings
```

Crie um arquivo `squarecloud.app` na raiz do projeto. Para um bot cujo arquivo principal é o `main.py` e importa `settings` do `settings.py`:

```systemd squarecloud.app theme={"system"}
DISPLAY_NAME=My Python Bot
MAIN=main.py
MEMORY=512
VERSION=recommended
AUTORESTART=true
```

O seu ZIP contém os seus arquivos `.py`, o `requirements.txt` e o `squarecloud.app`, sem o token. Defina a `DISCORD_TOKEN` e as outras variáveis no dashboard ou com `squarecloud app env set`: veja [Variáveis de ambiente](/pt-br/platform/environment-variables). Se uma variável obrigatória estiver faltando, o `ValidationError` aparece nos logs da aplicação assim que ela inicia.

## Próximos passos

<CardGroup cols={3}>
  <Card title="Variáveis de ambiente" icon="key" href="/pt-br/platform/environment-variables">
    Defina as variáveis que a sua classe de configurações lê.
  </Card>

  <Card title="FastAPI" icon="python" href="/pt-br/tutorials/api/fastapi">
    Faça deploy de uma API que valida as requisições com o pydantic.
  </Card>

  <Card title="Bot do Discord" icon="discord" href="/pt-br/tutorials/bots/discord">
    Hospede um bot que lê o token do ambiente.
  </Card>
</CardGroup>

## Gostou desse artigo?

* Criamos este conteúdo com o máximo de cuidado para oferecer a melhor ajuda possível.
  Se o artigo contribuiu de alguma forma, valorize nosso trabalho! Desenvolvedores já avaliaram a Square Cloud com **4,9/5 em 402 avaliações** no Google e Trustpilot: deixe a sua também! Isso nos ajuda a entender o que é mais importante para você.

<CardGroup cols={2}>
  <Card title="Google Reviews" icon="google" href="https://g.page/r/CYZenpQcDgTzEAI/review">
    Deixe sua avaliação no Google Reviews.
  </Card>

  <Card title="Trustpilot" icon="star" href="https://www.trustpilot.com/review/squarecloud.app">
    Deixe sua avaliação no Trustpilot.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.