diff --git a/docs/pt/docs/advanced/advanced-python-types.md b/docs/pt/docs/advanced/advanced-python-types.md index f92a20bd46..6a0c2f97ac 100644 --- a/docs/pt/docs/advanced/advanced-python-types.md +++ b/docs/pt/docs/advanced/advanced-python-types.md @@ -13,17 +13,17 @@ from typing import Union def say_hi(name: Union[str, None]): - print(f"Hi {name}!") + print(f"Hi {name}!") ``` O `typing` também tem um atalho para declarar que algo pode ser `None`, com `Optional`. -Aqui vai uma dica do meu ponto de vista bem subjetivo: +Aqui vai uma dica do meu ponto de vista bem **subjetivo**: * 🚨 Evite usar `Optional[SomeType]` -* Em vez disso ✨ use **`Union[SomeType, None]`** ✨. +* Em vez disso ✨ **use `Union[SomeType, None]`** ✨. -Ambos são equivalentes e, por baixo, são a mesma coisa, mas eu recomendaria `Union` em vez de `Optional` porque a palavra "opcional" sugere que o valor é opcional; na verdade, significa "pode ser `None`", mesmo quando não é opcional e continua sendo obrigatório. +Ambos são equivalentes e, por baixo, são a mesma coisa, mas eu recomendaria `Union` em vez de `Optional` porque a palavra "**opcional**" sugere que o valor é opcional; na verdade, significa "pode ser `None`", mesmo quando não é opcional e continua sendo obrigatório. Acho que `Union[SomeType, None]` é mais explícito quanto ao significado. @@ -39,13 +39,13 @@ def say_hi(name: Optional[str]): print(f"Hey {name}!") ``` -O parâmetro `name` é definido como `Optional[str]`, mas não é opcional; não é possível chamar a função sem o parâmetro: +O parâmetro `name` é definido como `Optional[str]`, mas **não é opcional**; não é possível chamar a função sem o parâmetro: ```Python say_hi() # Ah, não, isso gera um erro! 😱 ``` -O parâmetro `name` continua obrigatório (não é opcional) porque não tem valor padrão. Ainda assim, `name` aceita `None` como valor: +O parâmetro `name` **continua obrigatório** (não é *opcional*) porque não tem valor padrão. Ainda assim, `name` aceita `None` como valor: ```Python say_hi(name=None) # Isso funciona, None é válido 🎉 diff --git a/docs/pt/docs/advanced/async-tests.md b/docs/pt/docs/advanced/async-tests.md index de4ecf9559..a074db43ad 100644 --- a/docs/pt/docs/advanced/async-tests.md +++ b/docs/pt/docs/advanced/async-tests.md @@ -8,13 +8,13 @@ Vamos ver como nós podemos fazer isso funcionar. ## pytest.mark.anyio { #pytest-mark-anyio } -Se quisermos chamar funções assíncronas em nossos testes, as nossas funções de teste precisam ser assíncronas. O AnyIO oferece um plugin bem legal para isso, que nos permite especificar que algumas das nossas funções de teste precisam ser chamadas de forma assíncrona. +Se quisermos chamar funções assíncronas em nossos testes, as nossas funções de teste precisam ser assíncronas. O AnyIO oferece um plugin útil para isso, que nos permite especificar que algumas das nossas funções de teste precisam ser chamadas de forma assíncrona. ## HTTPX { #httpx } Mesmo que a sua aplicação **FastAPI** utilize funções normais com `def` no lugar de `async def`, ela ainda é uma aplicação `async` por baixo dos panos. -O `TestClient` faz algumas mágicas para invocar a aplicação FastAPI assíncrona em suas funções `def` normais, utilizando o pytest padrão. Porém a mágica não acontece mais quando nós estamos utilizando dentro de funções assíncronas. Ao executar os nossos testes de forma assíncrona, nós não podemos mais utilizar o `TestClient` dentro das nossas funções de teste. +O `TestClient` faz algumas mágicas para invocar a aplicação FastAPI assíncrona em suas funções de teste `def` normais, utilizando o pytest padrão. Porém a mágica não acontece mais quando nós estamos utilizando dentro de funções assíncronas. Ao executar os nossos testes de forma assíncrona, nós não podemos mais utilizar o `TestClient` dentro das nossas funções de teste. O `TestClient` é baseado no [HTTPX](https://www.python-httpx.org), e felizmente nós podemos utilizá-lo diretamente para testar a API. @@ -38,7 +38,7 @@ O arquivo `test_main.py` teria os testes para o arquivo `main.py`, ele poderia f {* ../../docs_src/async_tests/app_a_py310/test_main.py *} -## Executá-lo { #run-it } +## Execute { #run-it } Você pode executar os seus testes normalmente via: @@ -71,7 +71,7 @@ Então podemos criar um `AsyncClient` com a aplicação, e enviar requisições Isso é equivalente a: ```Python -response = client.get('/') +response = client.get("/") ``` ...que nós utilizamos para fazer as nossas requisições utilizando o `TestClient`. diff --git a/docs/pt/docs/advanced/behind-a-proxy.md b/docs/pt/docs/advanced/behind-a-proxy.md index 1bfe0bc4b2..3d348885a9 100644 --- a/docs/pt/docs/advanced/behind-a-proxy.md +++ b/docs/pt/docs/advanced/behind-a-proxy.md @@ -8,7 +8,7 @@ Esses proxies podem lidar com certificados HTTPS e outras coisas. Um **proxy** na frente da sua aplicação normalmente definiria alguns headers dinamicamente antes de enviar as requisições para o seu **servidor**, para informar ao servidor que a requisição foi **encaminhada** pelo proxy, informando a URL original (pública), incluindo o domínio, que está usando HTTPS, etc. -O programa do **servidor** (por exemplo, **Uvicorn** via **CLI do FastAPI**) é capaz de interpretar esses headers e então repassar essas informações para a sua aplicação. +O **servidor** iniciado por `fastapi run` é capaz de interpretar esses headers e então repassar essas informações para a sua aplicação. Mas, por segurança, como o servidor não sabe que está atrás de um proxy confiável, ele não interpretará esses headers. @@ -34,8 +34,6 @@ Se o seu **servidor** estiver atrás de um **proxy** confiável e somente o prox ```console $ uv run fastapi run --forwarded-allow-ips="*" - -INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -101,7 +99,7 @@ Quando a **CLI do FastAPI** é configurada com `--forwarded-allow-ips`, ela conf Você pode ter um proxy que adiciona um prefixo de path à sua aplicação. -Nesses casos, você pode usar `root_path` para configurar sua aplicação. +Nesses casos, você pode configurar o servidor com `fastapi run --root-path`. O `root_path` é um mecanismo fornecido pela especificação ASGI (na qual o FastAPI é construído, através do Starlette). @@ -117,7 +115,7 @@ Embora todo o seu código esteja escrito assumindo que existe apenas `/app`. {* ../../docs_src/behind_a_proxy/tutorial001_py310.py hl[6] *} -E o proxy estaria **"removendo"** o **prefixo de path** dinamicamente antes de transmitir a requisição para o servidor da aplicação (provavelmente Uvicorn via CLI do FastAPI), mantendo sua aplicação convencida de que está sendo servida em `/app`, para que você não precise atualizar todo o seu código para incluir o prefixo `/api/v1`. +E o proxy estaria **"removendo"** o **prefixo de path** dinamicamente antes de transmitir a requisição para o servidor, mantendo sua aplicação convencida de que está sendo servida em `/app`, para que você não precise atualizar todo o seu código para incluir o prefixo `/api/v1`. Até aqui, tudo funcionaria normalmente. @@ -161,7 +159,7 @@ A interface de documentação também precisaria do OpenAPI schema para declarar } ``` -Neste exemplo, o "Proxy" poderia ser algo como **Traefik**. E o servidor seria algo como a CLI do FastAPI com **Uvicorn**, executando sua aplicação FastAPI. +Neste exemplo, o "Proxy" poderia ser algo como **Traefik**. E `fastapi run` iniciaria o servidor executando sua aplicação FastAPI. ### Fornecendo o `root_path` { #providing-the-root-path } @@ -171,14 +169,10 @@ Para conseguir isso, você pode usar a opção de linha de comando `--root-path` ```console $ uv run fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 - -INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` -Se você usar Hypercorn, ele também tem a opção `--root-path`. - /// note | Detalhes Técnicos A especificação ASGI define um `root_path` para esse caso de uso. @@ -195,14 +189,12 @@ Aqui estamos incluindo-o na mensagem apenas para fins de demonstração. {* ../../docs_src/behind_a_proxy/tutorial001_py310.py hl[8] *} -Então, se você iniciar o Uvicorn com: +Então, se você iniciar o servidor com:
-## Proibindo Cabeçalhos adicionais { #forbid-extra-headers }
+## Proíba Cabeçalhos adicionais { #forbid-extra-headers }
Em alguns casos de uso especiais (provavelmente não muito comuns), você pode querer **restringir** os cabeçalhos que você quer receber.
-Você pode usar a configuração dos modelos do Pydantic para proibir (`forbid`) quaisquer campos `extra`:
+Você pode usar a configuração dos modelos do Pydantic para proibir quaisquer campos `extra` com `forbid`:
{* ../../docs_src/header_param_models/tutorial002_an_py310.py hl[10] *}
@@ -51,7 +51,7 @@ Por exemplo, se o cliente tentar enviar um cabeçalho `tool` com o valor `plumbu
}
```
-## Desativar conversão de underscores { #disable-convert-underscores }
+## Desative a conversão de underscores { #disable-convert-underscores }
Da mesma forma que com parâmetros de cabeçalho normais, quando você tem caracteres de sublinhado nos nomes dos parâmetros, eles são **automaticamente convertidos em hifens**.
@@ -67,6 +67,26 @@ Antes de definir `convert_underscores` como `False`, tenha em mente que alguns p
///
+## Combine Modelos de Parâmetros { #combine-parameter-models }
+
+Você pode combinar múltiplos modelos de parâmetros de cabeçalho com parâmetros de cabeçalho individuais e dependências. Cada modelo é extraído e validado de forma independente, conforme explicado para [modelos de parâmetros de consulta](query-param-models.md#combine-parameter-models).
+
+A configuração `extra` de cada modelo se aplica a todos os parâmetros de cabeçalho, incluindo aqueles declarados em outros modelos ou dependências. Com `extra="forbid"`, qualquer cabeçalho fora desse modelo é rejeitado. Com `extra="allow"`, esses cabeçalhos são incluídos como campos extras do modelo.
+
+Cada modelo usa sua própria configuração `Header(convert_underscores=...)`, tanto ao ler a requisição quanto ao gerar o OpenAPI. Aliases explícitos de campos permanecem como nomes literais de cabeçalhos.
+
+## Modelos Opcionais de Parâmetros de Cabeçalho { #optional-header-parameter-models }
+
+Declare um modelo de parâmetros de cabeçalho com `| None` e um valor padrão de `None` para tornar o grupo opcional.
+
+{* ../../docs_src/header_param_models/tutorial004_an_py310.py hl[15] *}
+
+Se nem `x-client-name` nem `x-client-version` forem enviados, `client` será `None`. Se qualquer um deles for enviado, o FastAPI validará o modelo e exigirá ambos os campos.
+
+As mesmas regras para valores padrão, campos extras e OpenAPI se aplicam aos [modelos opcionais de parâmetros de consulta](query-param-models.md#optional-query-parameter-models).
+
+Cabeçalhos como `Host` também seguem a configuração `extra` do modelo. Com `extra="allow"`, eles tornam o modelo presente mesmo que nenhum dos campos declarados seja fornecido.
+
## Resumo { #summary }
Você pode utilizar **modelos do Pydantic** para declarar **cabeçalhos** no **FastAPI**. 😎
diff --git a/docs/pt/docs/tutorial/path-params-numeric-validations.md b/docs/pt/docs/tutorial/path-params-numeric-validations.md
index 0a48c09e4d..52c2e846f6 100644
--- a/docs/pt/docs/tutorial/path-params-numeric-validations.md
+++ b/docs/pt/docs/tutorial/path-params-numeric-validations.md
@@ -28,7 +28,7 @@ Por exemplo, para declarar um valor de metadado `title` para o parâmetro de pat
/// note | Nota
-Um parâmetro de path é sempre obrigatório, pois precisa fazer parte do path. Mesmo que você o declare como `None` ou defina um valor padrão, isso não afetaria nada, ele ainda seria sempre obrigatório.
+Um parâmetro de path é sempre obrigatório, pois precisa fazer parte do path da URL. Adicionar `None` ao seu tipo não o torna opcional. Um parâmetro declarado com `Path` não pode ter um valor padrão.
///
@@ -68,7 +68,7 @@ Isso provavelmente não é tão importante ou necessário se você usar `Annotat
///
-Aqui vai um pequeno truque que pode ser útil, mas você não vai precisar dele com frequência.
+Aqui vai um **pequeno truque** que pode ser útil, mas você não vai precisar dele com frequência.
Se você quiser:
@@ -81,7 +81,7 @@ Se você quiser:
Passe `*`, como o primeiro parâmetro da função.
-O Python não fará nada com esse `*`, mas saberá que todos os parâmetros seguintes devem ser chamados como argumentos nomeados (pares chave-valor), também conhecidos como kwargs. Mesmo que eles não tenham um valor padrão.
+O Python não fará nada com esse `*`, mas saberá que todos os parâmetros seguintes devem ser chamados como argumentos nomeados (pares chave-valor), também conhecidos como kwargs. Mesmo que eles não tenham um valor padrão.
{* ../../docs_src/path_params_numeric_validations/tutorial003_py310.py hl[7] *}
@@ -95,7 +95,7 @@ Tenha em mente que, se você usar `Annotated`, como você não está usando valo
Com `Query` e `Path` (e outras que você verá depois) você pode declarar restrições numéricas.
-Aqui, com `ge=1`, `item_id` precisará ser um número inteiro “`g`reater than or `e`qual” a `1`.
+Aqui, com `ge=1`, `item_id` precisará ser um número inteiro “maior que ou igual” — `g`reater than or `e`qual — a `1`.
{* ../../docs_src/path_params_numeric_validations/tutorial004_an_py310.py hl[10] *}
@@ -103,8 +103,8 @@ Aqui, com `ge=1`, `item_id` precisará ser um número inteiro “`g`reater than
O mesmo se aplica a:
-* `gt`: maior que (`g`reater `t`han)
-* `le`: menor que ou igual (`l`ess than or `e`qual)
+* `gt`: maior que — `g`reater `t`han
+* `le`: menor que ou igual — `l`ess than or `e`qual
{* ../../docs_src/path_params_numeric_validations/tutorial005_an_py310.py hl[10] *}
@@ -112,11 +112,11 @@ O mesmo se aplica a:
Validações numéricas também funcionam para valores `float`.
-Aqui é onde se torna importante poder declarar gt e não apenas ge. Com isso você pode exigir, por exemplo, que um valor seja maior que `0`, mesmo que seja menor que `1`.
+Aqui é onde se torna importante poder declarar gt e não apenas ge. Com isso você pode exigir, por exemplo, que um valor seja maior que `0`, mesmo que seja menor que `1`.
Assim, `0.5` seria um valor válido. Mas `0.0` ou `0` não seriam.
-E o mesmo para lt.
+E o mesmo para lt.
{* ../../docs_src/path_params_numeric_validations/tutorial006_an_py310.py hl[13] *}
@@ -126,10 +126,10 @@ Com `Query`, `Path` (e outras que você ainda não viu) você pode declarar meta
E você também pode declarar validações numéricas:
-* `gt`: maior que (`g`reater `t`han)
-* `ge`: maior que ou igual (`g`reater than or `e`qual)
-* `lt`: menor que (`l`ess `t`han)
-* `le`: menor que ou igual (`l`ess than or `e`qual)
+* `gt`: maior que — `g`reater `t`han
+* `ge`: maior que ou igual — `g`reater than or `e`qual
+* `lt`: menor que — `l`ess `t`han
+* `le`: menor que ou igual — `l`ess than or `e`qual
/// note | Nota
diff --git a/docs/pt/docs/tutorial/query-param-models.md b/docs/pt/docs/tutorial/query-param-models.md
index 7fc59c0335..72f52c2d9d 100644
--- a/docs/pt/docs/tutorial/query-param-models.md
+++ b/docs/pt/docs/tutorial/query-param-models.md
@@ -28,7 +28,7 @@ Você pode ver os parâmetros de consulta na IU da documentação em `/docs`:
## Restrinja Parâmetros de Consulta Extras { #forbid-extra-query-parameters }
-Em alguns casos especiais (provavelmente não muito comuns), você queira **restringir** os parâmetros de consulta que deseja receber.
+Em alguns casos especiais (provavelmente não muito comuns), você pode querer **restringir** os parâmetros de consulta que deseja receber.
Você pode usar a configuração do modelo Pydantic para `forbid` qualquer campo `extra`:
@@ -57,6 +57,42 @@ Eles receberão um retorno de **erro** informando-os que o parâmetro de consult
}
```
+## Combine Modelos de Parâmetros { #combine-parameter-models }
+
+Você pode declarar vários modelos de parâmetros de consulta e combiná-los com parâmetros de consulta individuais ou dependências.
+
+{* ../../docs_src/query_param_models/tutorial003_an_py310.py hl[9:15,20:22] *}
+
+Os parâmetros da requisição permanecem no mesmo nível.
+
+```http
+https://example.com/items/?limit=5&offset=10&tags=red&tags=blue&search=shirt
+```
+
+Não há chaves `pagination` ou `filters` na string de consulta. Cada modelo valida os parâmetros de consulta de forma independente, com seus próprios valores padrão, validadores de campo e de modelo. O mesmo se aplica quando os modelos ou parâmetros individuais são declarados em dependências.
+
+Se os modelos compartilham um nome ou alias de parâmetro, cada modelo valida esse parâmetro da requisição de forma independente. Use nomes ou aliases distintos para valores independentes. O OpenAPI lista um parâmetro compartilhado apenas uma vez, assim como faz com parâmetros compartilhados com dependências, portanto as declarações compartilhadas deveriam descrever o mesmo tipo e as mesmas restrições.
+
+A configuração `extra` de cada modelo se aplica a todos os parâmetros de consulta, incluindo os declarados em outros modelos ou dependências. Com `extra="forbid"`, qualquer parâmetro fora desse modelo é rejeitado. Com `extra="allow"`, esses parâmetros são incluídos como extras do modelo.
+
+Isso também funciona para modelos `Header` e `Cookie`.
+
+## Modelos Opcionais de Parâmetros de Consulta { #optional-query-parameter-models }
+
+Declare um modelo de parâmetros de consulta com `| None` e um valor padrão de `None` para tornar o grupo opcional.
+
+{* ../../docs_src/query_param_models/tutorial004_an_py310.py hl[18] *}
+
+Se nem `start` nem `end` forem enviados, `date_range` será `None`. Se qualquer um deles for enviado, o FastAPI validará o modelo e exigirá ambos os campos.
+
+Usar `| None` sem um valor padrão ainda torna o parâmetro obrigatório.
+
+Parâmetros extras seguem a configuração `extra` do modelo. Extras ignorados não fazem com que o modelo seja considerado presente.
+
+O OpenAPI lista os campos do grupo individualmente e os marca como opcionais.
+
+Você também pode declarar [modelos de parâmetros de cabeçalho](header-param-models.md#optional-header-parameter-models) e [modelos de parâmetros de cookie](cookie-param-models.md#optional-cookie-parameter-models) opcionais.
+
## Resumo { #summary }
Você pode utilizar **modelos Pydantic** para declarar **parâmetros de consulta** no **FastAPI**. 😎
diff --git a/docs/pt/docs/tutorial/query-params-str-validations.md b/docs/pt/docs/tutorial/query-params-str-validations.md
index 73171d3bdc..353aa59f5e 100644
--- a/docs/pt/docs/tutorial/query-params-str-validations.md
+++ b/docs/pt/docs/tutorial/query-params-str-validations.md
@@ -220,14 +220,22 @@ Então, quando você precisa declarar um valor como obrigatório usando `Query`,
{* ../../docs_src/query_params_str_validations/tutorial006_an_py310.py hl[9] *}
-### Obrigatório, pode ser `None` { #required-can-be-none }
+### Parâmetros obrigatórios e `None` { #required-parameters-and-none }
-Você pode declarar que um parâmetro pode aceitar `None`, mas que ainda assim é obrigatório. Isso forçaria os clientes a enviarem um valor, mesmo que o valor seja `None`.
-
-Para isso, você pode declarar que `None` é um tipo válido, mas simplesmente não declarar um valor padrão:
+O tipo `str | None` permite `None` como valor Python, mas não torna um parâmetro de consulta opcional. Sem um valor padrão, o parâmetro continua obrigatório:
{* ../../docs_src/query_params_str_validations/tutorial006c_an_py310.py hl[9] *}
+Os valores dos parâmetros de consulta chegam como strings e não têm uma representação nativa de `None`. Enviar `?q=None` ou `?q=null` envia as strings `"None"` e `"null"`, respectivamente. Enviar `?q=` envia uma string vazia, que falha na validação `min_length=3` neste exemplo.
+
+Para permitir que os clientes omitam `q` e usem `None` como seu valor, atribua a ele o valor padrão `None`:
+
+```Python
+q: Annotated[str | None, Query(min_length=3)] = None
+```
+
+Corpos de requisição JSON, ao contrário dos parâmetros de consulta, podem conter um valor `null` explícito.
+
## Lista de parâmetros de consulta / múltiplos valores { #query-parameter-list-multiple-values }
Quando você define explicitamente um parâmetro de consulta com `Query`, você também pode declará-lo para receber uma lista de valores, ou seja, receber múltiplos valores.
@@ -296,9 +304,9 @@ Você também pode usar `list` diretamente em vez de `list[str]`:
/// note | Nota
-Tenha em mente que, neste caso, o FastAPI não verificará o conteúdo da lista.
+Tenha em mente que, neste caso, o FastAPI não verificará o conteúdo da list.
-Por exemplo, `list[int]` verificaria (e documentaria) que os conteúdos da lista são inteiros. Mas `list` sozinho não.
+Por exemplo, `list[int]` verificaria (e documentaria) que os conteúdos da list são inteiros. Mas `list` sozinho não.
///
@@ -358,7 +366,7 @@ A documentação vai mostrar assim:
-## Excluir parâmetros do OpenAPI { #exclude-parameters-from-openapi }
+## Exclua parâmetros do OpenAPI { #exclude-parameters-from-openapi }
Para excluir um parâmetro de consulta do esquema OpenAPI gerado (e portanto, dos sistemas de documentação automáticos), defina o parâmetro `include_in_schema` de `Query` como `False`:
@@ -416,7 +424,7 @@ Com `data.items()` obtemos um
-## Proibir Campos Extras de Formulários { #forbid-extra-form-fields }
+## Proíba Campos Extras de Formulários { #forbid-extra-form-fields }
Em alguns casos de uso especiais (provavelmente não muito comum), você pode desejar **restringir** os campos do formulário para aceitar apenas os declarados no modelo Pydantic. E **proibir** qualquer campo **extra**.
@@ -46,7 +48,7 @@ Isso é suportado desde a versão `0.114.0` do FastAPI. 🤓
///
-Você pode utilizar a configuração de modelo do Pydantic para `proibir` qualquer campo `extra`:
+Você pode utilizar a configuração de modelo do Pydantic para definir `forbid` para qualquer campo `extra`:
{* ../../docs_src/request_form_models/tutorial002_an_py310.py hl[12] *}
@@ -73,6 +75,58 @@ Ele receberá um retorno de erro informando-o que o campo `extra` não é permit
}
```
+## Combine Modelos de Formulários { #combine-form-models }
+
+Você pode combinar vários modelos de formulários com parâmetros `Form` individuais.
+
+{* ../../docs_src/request_form_models/tutorial003_an_py310.py hl[9:14,19:21] *}
+
+O cliente envia `name`, `tags` e `token` como campos de formulário. Cada modelo valida os campos do formulário de forma independente.
+
+A configuração `extra` de cada modelo se aplica a todos os campos do formulário, incluindo campos e arquivos declarados em outros parâmetros ou dependências. Com `extra="forbid"`, qualquer campo fora desse modelo é rejeitado. Com `extra="allow"`, esses campos são incluídos como extras do modelo.
+
+Se várias declarações usarem o mesmo nome de campo de formulário, cada uma validará o valor desse campo. Use tipos e restrições compatíveis para campos compartilhados, para que o esquema OpenAPI possa descrevê-los de forma consistente.
+
+## Modelos de Formulários Opcionais { #optional-form-models }
+
+Declare um modelo de formulário com `| None` e um valor padrão `None` para tornar o grupo opcional.
+
+{* ../../docs_src/request_form_models/tutorial005_an_py310.py hl[17] *}
+
+Se nem `name` nem `age` forem enviados, `profile` será `None`. Se qualquer um deles for enviado, o FastAPI validará o modelo e exigirá ambos os campos. Um valor vazio enviado também conta como fornecimento de um campo.
+
+Usar `| None` sem um valor padrão ainda torna o parâmetro obrigatório.
+
+Campos extras seguem a configuração `extra` do modelo. Extras ignorados não fazem com que o modelo seja considerado presente.
+
+Um modelo opcional que contenha apenas caixas de seleção desmarcadas é omitido. Envie um valor como `enabled=false` para fornecê-lo explicitamente.
+
+## Uniões Opcionais de Modelos de Formulários { #optional-unions-of-form-models }
+
+Você também pode usar uma união opcional de modelos.
+
+{* ../../docs_src/request_form_models/tutorial006_an_py310.py hl[9:16,21] *}
+
+Se nenhum campo de formulário for enviado, `contact` será `None`. Envie `kind=person` com `name`, ou `kind=company` com `company_name`. O discriminador seleciona qual modelo validar.
+
+## Combine Uniões de Modelos de Formulários { #combine-unions-of-form-models }
+
+Você pode combinar uniões com outros modelos de formulários, parâmetros `Form` individuais e parâmetros `File`. Cada união é validada de forma independente.
+
+{* ../../docs_src/request_form_models/tutorial007_an_py310.py hl[31:35] *}
+
+Envie todos os campos no mesmo formulário. Por exemplo, envie `contact_type=person`, `name=Rick`, `notification_type=email`, `email=rick@example.com` e `token=secret`.
+
+Omita os campos de notificação para deixar `notification` como `None`.
+
+## Modelos de Formulários e Arquivos { #form-models-and-files }
+
+Você também pode combinar um modelo de formulário com [parâmetros de arquivo](request-files.md).
+
+{* ../../docs_src/request_form_models/tutorial004_an_py310.py hl[14] *}
+
+Aqui, o cliente envia o campo `name` e o arquivo `avatar` usando `multipart/form-data`.
+
## Resumo { #summary }
Você pode utilizar modelos Pydantic para declarar campos de formulários no FastAPI. 😎
diff --git a/docs/pt/docs/tutorial/request-forms.md b/docs/pt/docs/tutorial/request-forms.md
index f055157479..8dc704725a 100644
--- a/docs/pt/docs/tutorial/request-forms.md
+++ b/docs/pt/docs/tutorial/request-forms.md
@@ -44,6 +44,14 @@ Para declarar corpos de formulário, você precisa usar `Form` explicitamente, p
///
+## Campos booleanos de formulário { #boolean-form-fields }
+
+Os navegadores omitem caixas de seleção desmarcadas ao enviar formulários HTML. Declare um parâmetro booleano de formulário com o valor padrão `False` para receber `False` quando a caixa estiver desmarcada:
+
+{* ../../docs_src/request_forms/tutorial002_an_py310.py hl[9] *}
+
+Uma caixa de seleção marcada envia seu valor, que por padrão é `"on"`. O **FastAPI** aceita `"on"` como `True`.
+
## Sobre "Campos de formulário" { #about-form-fields }
A forma como os formulários HTML (``) enviam os dados para o servidor normalmente usa uma codificação "especial" para esses dados, é diferente do JSON.
@@ -56,6 +64,8 @@ Os dados dos formulários são normalmente codificados usando o "media type" `ap
Mas quando o formulário inclui arquivos, ele é codificado como `multipart/form-data`. Você lerá sobre como lidar com arquivos no próximo capítulo.
+Você pode usar `Form(media_type="multipart/form-data")` para descrever um formulário multipart no OpenAPI. Configurá-lo em um parâmetro é suficiente ao combinar parâmetros de formulário ou modelos.
+
Se você quiser ler mais sobre essas codificações e campos de formulário, vá para a [documentação web da MDN para `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
///
diff --git a/docs/pt/docs/tutorial/response-model.md b/docs/pt/docs/tutorial/response-model.md
index 2cbc50c025..dc124979c1 100644
--- a/docs/pt/docs/tutorial/response-model.md
+++ b/docs/pt/docs/tutorial/response-model.md
@@ -2,7 +2,7 @@
Você pode declarar o tipo usado para a resposta anotando o **tipo de retorno** da *função de operação de rota*.
-Você pode usar **anotações de tipo** da mesma forma que usaria para dados de entrada em **parâmetros** de função, você pode usar modelos Pydantic, listas, dicionários, valores escalares como inteiros, booleanos, etc.
+Você pode usar **anotações de tipo** da mesma forma que usaria para dados de entrada em **parâmetros** de função, você pode usar modelos Pydantic, lists, dicionários, valores escalares como inteiros, booleanos, etc.
{* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *}
@@ -156,7 +156,7 @@ Primeiro, vamos ver como editores, mypy e outras ferramentas veriam isso.
Anotamos o tipo de retorno da função como `BaseUser`, mas na verdade estamos retornando uma instância `UserIn`.
-O editor, mypy e outras ferramentas não reclamarão disso porque, em termos de digitação, `UserIn` é uma subclasse de `BaseUser`, o que significa que é um tipo *válido* quando o que é esperado é qualquer coisa que seja um `BaseUser`.
+O editor, mypy e outras ferramentas não reclamarão disso porque, em termos de tipagem, `UserIn` é uma subclasse de `BaseUser`, o que significa que é um tipo *válido* quando o que é esperado é qualquer coisa que seja um `BaseUser`.
### Filtragem de dados FastAPI { #fastapi-data-filtering }
@@ -168,7 +168,7 @@ Dessa forma, você pode obter o melhor dos dois mundos: anotações de tipo com
## Veja na documentação { #see-it-in-the-docs }
-Quando você vê a documentação automática, pode verificar se o modelo de entrada e o modelo de saída terão seus próprios esquemas JSON:
+Quando você vê a documentação automática, pode verificar se o modelo de entrada e o modelo de saída terão seus próprios JSON Schema:
@@ -228,7 +228,7 @@ Seu modelo de resposta pode ter valores padrão, como:
* `description: Union[str, None] = None` (ou `str | None = None` no Python 3.10) tem um padrão de `None`.
* `tax: float = 10.5` tem um padrão de `10.5`.
-* `tags: List[str] = []` tem um padrão de uma lista vazia: `[]`.
+* `tags: List[str] = []` tem um padrão de uma list vazia: `[]`.
mas você pode querer omiti-los do resultado se eles não foram realmente armazenados.
@@ -266,6 +266,7 @@ conforme descrito na [documentação do Pydantic](https://pydantic.dev/docs/vali
Mas se seus dados tiverem valores para os campos do modelo com valores padrões, como o item com ID `bar`:
+
```Python hl_lines="3 5"
{
"name": "Bar",
@@ -274,6 +275,7 @@ Mas se seus dados tiverem valores para os campos do modelo com valores padrões,
"tax": 20.2
}
```
+
eles serão incluídos na resposta.
@@ -281,6 +283,7 @@ eles serão incluídos na resposta.
Se os dados tiverem os mesmos valores que os padrões, como o item com ID `baz`:
+
```Python hl_lines="3 5-6"
{
"name": "Baz",
@@ -290,6 +293,7 @@ Se os dados tiverem os mesmos valores que os padrões, como o item com ID `baz`:
"tags": []
}
```
+
O FastAPI é inteligente o suficiente (na verdade, o Pydantic é inteligente o suficiente) para perceber que, embora `description`, `tax` e `tags` tenham os mesmos valores que os padrões, eles foram definidos explicitamente (em vez de retirados dos padrões).
@@ -299,7 +303,7 @@ Portanto, eles serão incluídos na resposta JSON.
Observe que os valores padrão podem ser qualquer coisa, não apenas `None`.
-Eles podem ser uma lista (`[]`), um `float` de `10.5`, etc.
+Eles podem ser uma list (`[]`), um `float` de `10.5`, etc.
///
diff --git a/docs/pt/docs/tutorial/security/simple-oauth2.md b/docs/pt/docs/tutorial/security/simple-oauth2.md
index 802879a53d..1a57750ded 100644
--- a/docs/pt/docs/tutorial/security/simple-oauth2.md
+++ b/docs/pt/docs/tutorial/security/simple-oauth2.md
@@ -96,7 +96,7 @@ Não estamos usando `scopes` neste exemplo, mas a funcionalidade está disponív
Agora, obtenha os dados do usuário do banco de dados (falso), usando o `username` do campo do formulário.
-Se não existir tal usuário, retornaremos um erro dizendo "Incorrect username or password".
+Se não existir tal usuário, retornaremos um erro dizendo "Nome de usuário ou senha incorretos".
Para o erro, usamos a exceção `HTTPException`:
@@ -136,17 +136,17 @@ Assim, o ladrão não poderá tentar usar essas mesmas senhas em outro sistema (
```Python
UserInDB(
- username = user_dict["username"],
- email = user_dict["email"],
- full_name = user_dict["full_name"],
- disabled = user_dict["disabled"],
- hashed_password = user_dict["hashed_password"],
+ username=user_dict["username"],
+ email=user_dict["email"],
+ full_name=user_dict["full_name"],
+ disabled=user_dict["disabled"],
+ hashed_password=user_dict["hashed_password"],
)
```
/// note | Nota
-Para uma explicação mais completa de `**user_dict`, verifique [a documentação para **Extra Models**](../extra-models.md#about-user-in-model-dump).
+Para uma explicação mais completa de `**user_dict`, verifique [a documentação para **Modelos Extras**](../extra-models.md#about-user-in-model-dump).
///
@@ -158,11 +158,11 @@ Deve ter um `token_type`. No nosso caso, como estamos usando tokens "Bearer", o
E deve ter um `access_token`, com uma string contendo nosso token de acesso.
-Para este exemplo simples, seremos completamente inseguros e retornaremos o mesmo `username` do token.
+Para este exemplo simples, seremos completamente inseguros e retornaremos o mesmo `username` como token.
/// tip | Dica
-No próximo capítulo, você verá uma implementação realmente segura, com hash de senha e tokens JWT.
+No próximo capítulo, você verá uma implementação realmente segura, com hash de senha e tokens JWT.
Mas, por enquanto, vamos nos concentrar nos detalhes específicos de que precisamos.
@@ -224,9 +224,9 @@ Clique no botão "Authorize".
Use as credenciais:
-User: `johndoe`
+Usuário: `johndoe`
-Password: `secret`
+Senha: `secret`
@@ -264,9 +264,9 @@ Se você clicar no ícone de cadeado, sair e tentar a mesma operação novamente
Agora tente com um usuário inativo, autentique-se com:
-User: `alice`
+Usuário: `alice`
-Password: `secret2`
+Senha: `secret2`
E tente usar a operação `GET` com o caminho `/users/me`.
@@ -286,4 +286,4 @@ Usando essas ferramentas, você pode tornar o sistema de segurança compatível
O único detalhe que falta é que ainda não é realmente "seguro".
-No próximo capítulo você verá como usar uma biblioteca de hashing de senha segura e tokens JWT.
+No próximo capítulo você verá como usar uma biblioteca de hashing de senha segura e tokens JWT.