mirror of
https://github.com/fastapi/fastapi.git
synced 2026-05-18 05:15:46 -04:00
🌐 Update translations for pt (update-outdated) (#15159)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Yurii Motov <yurii.motov.monte@gmail.com>
This commit is contained in:
committed by
GitHub
parent
06cdff4488
commit
40301c86ee
@@ -62,7 +62,7 @@ E então outra tarefa em segundo plano gerada na *função de operação de rota
|
||||
|
||||
## Detalhes técnicos { #technical-details }
|
||||
|
||||
A classe `BackgroundTasks` vem diretamente de <a href="https://www.starlette.dev/background/" class="external-link" target="_blank">`starlette.background`</a>.
|
||||
A classe `BackgroundTasks` vem diretamente de [`starlette.background`](https://www.starlette.dev/background/).
|
||||
|
||||
Ela é importada/incluída diretamente no FastAPI para que você possa importá-la de `fastapi` e evitar importar acidentalmente a alternativa `BackgroundTask` (sem o `s` no final) de `starlette.background`.
|
||||
|
||||
@@ -70,11 +70,11 @@ Usando apenas `BackgroundTasks` (e não `BackgroundTask`), é possível usá-la
|
||||
|
||||
Ainda é possível usar `BackgroundTask` sozinho no FastAPI, mas você precisa criar o objeto no seu código e retornar uma `Response` da Starlette incluindo-o.
|
||||
|
||||
Você pode ver mais detalhes na <a href="https://www.starlette.dev/background/" class="external-link" target="_blank">documentação oficial da Starlette para tarefas em segundo plano</a>.
|
||||
Você pode ver mais detalhes na [documentação oficial da Starlette para tarefas em segundo plano](https://www.starlette.dev/background/).
|
||||
|
||||
## Ressalva { #caveat }
|
||||
|
||||
Se você precisar realizar computação pesada em segundo plano e não necessariamente precisar que seja executada pelo mesmo processo (por exemplo, você não precisa compartilhar memória, variáveis, etc.), pode se beneficiar do uso de outras ferramentas maiores, como o <a href="https://docs.celeryq.dev" class="external-link" target="_blank">Celery</a>.
|
||||
Se você precisar realizar computação pesada em segundo plano e não necessariamente precisar que seja executada pelo mesmo processo (por exemplo, você não precisa compartilhar memória, variáveis, etc.), pode se beneficiar do uso de outras ferramentas maiores, como o [Celery](https://docs.celeryq.dev).
|
||||
|
||||
Elas tendem a exigir configurações mais complexas, um gerenciador de fila de mensagens/tarefas, como RabbitMQ ou Redis, mas permitem executar tarefas em segundo plano em vários processos e, especialmente, em vários servidores.
|
||||
|
||||
|
||||
@@ -123,7 +123,7 @@ Agora usaremos uma dependência simples para ler um cabeçalho `X-Token` persona
|
||||
|
||||
Estamos usando um cabeçalho inventado para simplificar este exemplo.
|
||||
|
||||
Mas em casos reais, você obterá melhores resultados usando os [Utilitários de Segurança](security/index.md){.internal-link target=_blank} integrados.
|
||||
Mas em casos reais, você obterá melhores resultados usando os [Utilitários de Segurança](security/index.md) integrados.
|
||||
|
||||
///
|
||||
|
||||
@@ -169,7 +169,7 @@ E podemos adicionar uma list de `dependencies` que serão adicionadas a todas as
|
||||
|
||||
/// tip | Dica
|
||||
|
||||
Observe que, assim como [dependências em *decoradores de operação de rota*](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, nenhum valor será passado para sua *função de operação de rota*.
|
||||
Observe que, assim como [dependências em *decoradores de operação de rota*](dependencies/dependencies-in-path-operation-decorators.md), nenhum valor será passado para sua *função de operação de rota*.
|
||||
|
||||
///
|
||||
|
||||
@@ -185,8 +185,8 @@ O resultado final é que os paths dos itens agora são:
|
||||
* Todas elas incluirão as `responses` predefinidas.
|
||||
* Todas essas *operações de rota* terão a list de `dependencies` avaliada/executada antes delas.
|
||||
* Se você também declarar dependências em uma *operação de rota* específica, **elas também serão executadas**.
|
||||
* As dependências do router são executadas primeiro, depois as [`dependencies` no decorador](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank} e, em seguida, as dependências de parâmetros normais.
|
||||
* Você também pode adicionar [dependências de `Segurança` com `scopes`](../advanced/security/oauth2-scopes.md){.internal-link target=_blank}.
|
||||
* As dependências do router são executadas primeiro, depois as [`dependencies` no decorador](dependencies/dependencies-in-path-operation-decorators.md) e, em seguida, as dependências de parâmetros normais.
|
||||
* Você também pode adicionar [dependências de `Segurança` com `scopes`](../advanced/security/oauth2-scopes.md).
|
||||
|
||||
/// tip | Dica
|
||||
|
||||
@@ -303,7 +303,7 @@ E como a maior parte de sua lógica agora viverá em seu próprio módulo espec
|
||||
|
||||
Você importa e cria uma classe `FastAPI` normalmente.
|
||||
|
||||
E podemos até declarar [dependências globais](dependencies/global-dependencies.md){.internal-link target=_blank} que serão combinadas com as dependências para cada `APIRouter`:
|
||||
E podemos até declarar [dependências globais](dependencies/global-dependencies.md) que serão combinadas com as dependências para cada `APIRouter`:
|
||||
|
||||
{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[1,3,7] title["app/main.py"] *}
|
||||
|
||||
@@ -353,7 +353,7 @@ A segunda versão é uma "importação absoluta":
|
||||
from app.routers import items, users
|
||||
```
|
||||
|
||||
Para saber mais sobre pacotes e módulos Python, leia <a href="https://docs.python.org/3/tutorial/modules.html" class="external-link" target="_blank">a documentação oficial do Python sobre módulos</a>.
|
||||
Para saber mais sobre pacotes e módulos Python, leia [a documentação oficial do Python sobre módulos](https://docs.python.org/3/tutorial/modules.html).
|
||||
|
||||
///
|
||||
|
||||
@@ -465,6 +465,37 @@ Como não podemos simplesmente isolá-los e "montá-los" independentemente do re
|
||||
|
||||
///
|
||||
|
||||
## Configure o `entrypoint` em `pyproject.toml` { #configure-the-entrypoint-in-pyproject-toml }
|
||||
|
||||
Como seu objeto `app` do FastAPI fica em `app/main.py`, você pode configurar o `entrypoint` no seu arquivo `pyproject.toml` assim:
|
||||
|
||||
```toml
|
||||
[tool.fastapi]
|
||||
entrypoint = "app.main:app"
|
||||
```
|
||||
|
||||
isso é equivalente a importar como:
|
||||
|
||||
```python
|
||||
from app.main import app
|
||||
```
|
||||
|
||||
Dessa forma o comando `fastapi` saberá onde encontrar sua aplicação.
|
||||
|
||||
/// Note | Nota
|
||||
|
||||
Você também poderia passar o path para o comando, como:
|
||||
|
||||
```console
|
||||
$ fastapi dev app/main.py
|
||||
```
|
||||
|
||||
Mas você teria que lembrar de passar o path correto toda vez que chamar o comando `fastapi`.
|
||||
|
||||
Além disso, outras ferramentas podem não conseguir encontrá-la, por exemplo a [Extensão do VS Code](../editor-support.md) ou a [FastAPI Cloud](https://fastapicloud.com), portanto é recomendável usar o `entrypoint` em `pyproject.toml`.
|
||||
|
||||
///
|
||||
|
||||
## Verifique a documentação automática da API { #check-the-automatic-api-docs }
|
||||
|
||||
Agora, execute sua aplicação:
|
||||
@@ -472,14 +503,14 @@ Agora, execute sua aplicação:
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ fastapi dev app/main.py
|
||||
$ fastapi dev
|
||||
|
||||
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
E abra a documentação em <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>.
|
||||
E abra a documentação em [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
|
||||
|
||||
Você verá a documentação automática da API, incluindo os paths de todos os submódulos, usando os paths (e prefixos) corretos e as tags corretas:
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ Por exemplo, nós podemos definir um modelo `Image`:
|
||||
|
||||
### Use o sub-modelo como um tipo { #use-the-submodel-as-a-type }
|
||||
|
||||
E então podemos usa-lo como o tipo de um atributo:
|
||||
E então podemos usá-lo como o tipo de um atributo:
|
||||
|
||||
{* ../../docs_src/body_nested_models/tutorial004_py310.py hl[18] *}
|
||||
|
||||
@@ -90,15 +90,15 @@ Novamente, apenas fazendo essa declaração, com o **FastAPI**, você ganha:
|
||||
* Suporte do editor (preenchimento automático, etc.), inclusive para modelos aninhados
|
||||
* Conversão de dados
|
||||
* Validação de dados
|
||||
* Documentação automatica
|
||||
* Documentação automática
|
||||
|
||||
## Tipos especiais e validação { #special-types-and-validation }
|
||||
|
||||
Além dos tipos singulares normais como `str`, `int`, `float`, etc. Você também pode usar tipos singulares mais complexos que herdam de `str`.
|
||||
|
||||
Para ver todas as opções possíveis, consulte a <a href="https://docs.pydantic.dev/latest/concepts/types/" class="external-link" target="_blank">Visão geral dos tipos do Pydantic</a>. Você verá alguns exemplos no próximo capítulo.
|
||||
Para ver todas as opções possíveis, consulte a [Visão geral dos tipos do Pydantic](https://docs.pydantic.dev/latest/concepts/types/). Você verá alguns exemplos no próximo capítulo.
|
||||
|
||||
Por exemplo, no modelo `Image` nós temos um campo `url`, nós podemos declara-lo como um `HttpUrl` do Pydantic invés de como uma `str`:
|
||||
Por exemplo, no modelo `Image` nós temos um campo `url`, nós podemos declará-lo como um `HttpUrl` do Pydantic invés de como uma `str`:
|
||||
|
||||
{* ../../docs_src/body_nested_models/tutorial005_py310.py hl[2,8] *}
|
||||
|
||||
@@ -110,7 +110,7 @@ Você também pode usar modelos Pydantic como subtipos de `list`, `set`, etc:
|
||||
|
||||
{* ../../docs_src/body_nested_models/tutorial006_py310.py hl[18] *}
|
||||
|
||||
Isso vai esperar(converter, validar, documentar, etc) um corpo JSON tal qual:
|
||||
Isso vai esperar (converter, validar, documentar, etc) um corpo JSON tal qual:
|
||||
|
||||
```JSON hl_lines="11"
|
||||
{
|
||||
@@ -198,7 +198,7 @@ Neste caso, você aceitaria qualquer `dict`, desde que tenha chaves` int` com va
|
||||
|
||||
/// tip | Dica
|
||||
|
||||
Leve em condideração que o JSON só suporta `str` como chaves.
|
||||
Leve em consideração que o JSON só suporta `str` como chaves.
|
||||
|
||||
Mas o Pydantic tem conversão automática de dados.
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
## Atualização substituindo com `PUT` { #update-replacing-with-put }
|
||||
|
||||
Para atualizar um item, você pode usar a operação <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT" class="external-link" target="_blank">HTTP `PUT`</a>.
|
||||
Para atualizar um item, você pode usar a operação [HTTP `PUT`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT).
|
||||
|
||||
Você pode usar `jsonable_encoder` para converter os dados de entrada em dados que podem ser armazenados como JSON (por exemplo, com um banco de dados NoSQL). Por exemplo, convertendo `datetime` em `str`.
|
||||
|
||||
@@ -28,7 +28,7 @@ E os dados seriam salvos com esse "novo" `tax` de `10.5`.
|
||||
|
||||
## Atualizações parciais com `PATCH` { #partial-updates-with-patch }
|
||||
|
||||
Você também pode usar a operação <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH" class="external-link" target="_blank">HTTP `PATCH`</a> para atualizar dados *parcialmente*.
|
||||
Você também pode usar a operação [HTTP `PATCH`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) para atualizar dados *parcialmente*.
|
||||
|
||||
Isso significa que você pode enviar apenas os dados que deseja atualizar, deixando o restante intacto.
|
||||
|
||||
@@ -95,6 +95,6 @@ Observe que o modelo de entrada ainda é validado.
|
||||
|
||||
Portanto, se você quiser receber atualizações parciais que possam omitir todos os atributos, você precisa ter um modelo com todos os atributos marcados como opcionais (com valores padrão ou `None`).
|
||||
|
||||
Para distinguir entre os modelos com todos os valores opcionais para **atualizações** e modelos com valores obrigatórios para **criação**, você pode usar as ideias descritas em [Modelos Adicionais](extra-models.md){.internal-link target=_blank}.
|
||||
Para distinguir entre os modelos com todos os valores opcionais para **atualizações** e modelos com valores obrigatórios para **criação**, você pode usar as ideias descritas em [Modelos Adicionais](extra-models.md).
|
||||
|
||||
///
|
||||
|
||||
@@ -6,7 +6,7 @@ O corpo da **requisição** é a informação enviada pelo cliente para sua API.
|
||||
|
||||
Sua API quase sempre precisa enviar um corpo na **resposta**. Mas os clientes não necessariamente precisam enviar **corpos de requisição** o tempo todo, às vezes eles apenas requisitam um path, talvez com alguns parâmetros de consulta, mas não enviam um corpo.
|
||||
|
||||
Para declarar um corpo da **requisição**, você utiliza os modelos do <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> com todos os seus poderes e benefícios.
|
||||
Para declarar um corpo da **requisição**, você utiliza os modelos do [Pydantic](https://docs.pydantic.dev/) com todos os seus poderes e benefícios.
|
||||
|
||||
/// info | Informação
|
||||
|
||||
@@ -73,7 +73,7 @@ Apenas com essa declaração de tipos do Python, o **FastAPI** irá:
|
||||
* Se algum dado for inválido, irá retornar um erro bem claro, indicando exatamente onde e o que estava incorreto.
|
||||
* Entregar a você a informação recebida no parâmetro `item`.
|
||||
* Como você o declarou na função como do tipo `Item`, você também terá o suporte do editor (preenchimento automático, etc) para todos os atributos e seus tipos.
|
||||
* Gerar definições de <a href="https://json-schema.org" class="external-link" target="_blank">JSON Schema</a> para o seu modelo; você também pode usá-las em qualquer outro lugar se fizer sentido para o seu projeto.
|
||||
* Gerar definições de [JSON Schema](https://json-schema.org) para o seu modelo; você também pode usá-las em qualquer outro lugar se fizer sentido para o seu projeto.
|
||||
* Esses schemas farão parte do esquema OpenAPI gerado, e serão usados pelas <abbr title="User Interfaces - Interfaces de usuário">UIs</abbr> de documentação automática.
|
||||
|
||||
## Documentação automática { #automatic-docs }
|
||||
@@ -102,15 +102,15 @@ E foi imensamente testado na fase de design, antes de qualquer implementação,
|
||||
|
||||
Houveram mudanças no próprio Pydantic para que isso fosse possível.
|
||||
|
||||
As capturas de tela anteriores foram capturas no <a href="https://code.visualstudio.com" class="external-link" target="_blank">Visual Studio Code</a>.
|
||||
As capturas de tela anteriores foram capturas no [Visual Studio Code](https://code.visualstudio.com).
|
||||
|
||||
Mas você terá o mesmo suporte do editor no <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a> e na maioria dos editores Python:
|
||||
Mas você terá o mesmo suporte do editor no [PyCharm](https://www.jetbrains.com/pycharm/) e na maioria dos editores Python:
|
||||
|
||||
<img src="/img/tutorial/body/image05.png">
|
||||
|
||||
/// tip | Dica
|
||||
|
||||
Se você utiliza o <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a> como editor, você pode utilizar o <a href="https://github.com/koxudaxi/pydantic-pycharm-plugin/" class="external-link" target="_blank">Plugin do Pydantic para o PyCharm </a>.
|
||||
Se você utiliza o [PyCharm](https://www.jetbrains.com/pycharm/) como editor, você pode utilizar o [Plugin do Pydantic para o PyCharm](https://github.com/koxudaxi/pydantic-pycharm-plugin/).
|
||||
|
||||
Melhora o suporte do editor para seus modelos Pydantic com:
|
||||
|
||||
@@ -163,4 +163,4 @@ Mas adicionar as anotações de tipo permitirá ao seu editor oferecer um suport
|
||||
|
||||
## Sem o Pydantic { #without-pydantic }
|
||||
|
||||
Se você não quer utilizar os modelos Pydantic, você também pode utilizar o parâmetro **Body**. Veja a documentação para [Body - Parâmetros múltiplos: Valores singulares no body](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank}.
|
||||
Se você não quer utilizar os modelos Pydantic, você também pode utilizar o parâmetro **Body**. Veja a documentação para [Body - Parâmetros múltiplos: Valores singulares no body](body-multiple-params.md#singular-values-in-body).
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# CORS (Cross-Origin Resource Sharing) { #cors-cross-origin-resource-sharing }
|
||||
|
||||
<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">CORS ou "Cross-Origin Resource Sharing"</a> refere-se às situações em que um frontend rodando em um navegador possui um código JavaScript que se comunica com um backend, e o backend está em uma "origem" diferente do frontend.
|
||||
[CORS ou "Cross-Origin Resource Sharing"](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) refere-se às situações em que um frontend rodando em um navegador possui um código JavaScript que se comunica com um backend, e o backend está em uma "origem" diferente do frontend.
|
||||
|
||||
## Origem { #origin }
|
||||
|
||||
@@ -56,10 +56,10 @@ Os seguintes argumentos são suportados:
|
||||
* `allow_origins` - Uma lista de origens que devem ter permissão para fazer requisições de origem cruzada. Por exemplo, `['https://example.org', 'https://www.example.org']`. Você pode usar `['*']` para permitir qualquer origem.
|
||||
* `allow_origin_regex` - Uma string regex para corresponder às origens que devem ter permissão para fazer requisições de origem cruzada. Por exemplo, `'https://.*\.example\.org'`.
|
||||
* `allow_methods` - Uma lista de métodos HTTP que devem ser permitidos para requisições de origem cruzada. O padrão é `['GET']`. Você pode usar `['*']` para permitir todos os métodos padrão.
|
||||
* `allow_headers` - Uma lista de cabeçalhos de solicitação HTTP que devem ter suporte para requisições de origem cruzada. O padrão é `[]`. Você pode usar `['*']` para permitir todos os cabeçalhos. Os cabeçalhos `Accept`, `Accept-Language`, `Content-Language` e `Content-Type` são sempre permitidos para <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests" class="external-link" rel="noopener" target="_blank">requisições CORS simples</a>.
|
||||
* `allow_headers` - Uma lista de cabeçalhos de solicitação HTTP que devem ter suporte para requisições de origem cruzada. O padrão é `[]`. Você pode usar `['*']` para permitir todos os cabeçalhos. Os cabeçalhos `Accept`, `Accept-Language`, `Content-Language` e `Content-Type` são sempre permitidos para [requisições CORS simples](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests).
|
||||
* `allow_credentials` - Indica que os cookies devem ser suportados para requisições de origem cruzada. O padrão é `False`.
|
||||
|
||||
Nenhum de `allow_origins`, `allow_methods` e `allow_headers` pode ser definido como `['*']` se `allow_credentials` estiver definido como `True`. Todos eles devem ser <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards" class="external-link" rel="noopener" target="_blank">especificados explicitamente</a>.
|
||||
Nenhum de `allow_origins`, `allow_methods` e `allow_headers` pode ser definido como `['*']` se `allow_credentials` estiver definido como `True`. Todos eles devem ser [especificados explicitamente](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards).
|
||||
|
||||
* `expose_headers` - Indica quaisquer cabeçalhos de resposta que devem ser disponibilizados ao navegador. O padrão é `[]`.
|
||||
* `max_age` - Define um tempo máximo em segundos para os navegadores armazenarem em cache as respostas CORS. O padrão é `600`.
|
||||
@@ -78,7 +78,7 @@ Qualquer solicitação com um cabeçalho `Origin`. Neste caso, o middleware pass
|
||||
|
||||
## Mais informações { #more-info }
|
||||
|
||||
Para mais informações sobre <abbr title="Cross-Origin Resource Sharing">CORS</abbr>, consulte a <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">documentação do CORS da Mozilla</a>.
|
||||
Para mais informações sobre <abbr title="Cross-Origin Resource Sharing">CORS</abbr>, consulte a [documentação do CORS da Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS).
|
||||
|
||||
/// note | Detalhes Técnicos
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ não será executada.
|
||||
|
||||
/// info | Informação
|
||||
|
||||
Para mais informações, consulte <a href="https://docs.python.org/3/library/__main__.html" class="external-link" target="_blank">a documentação oficial do Python</a>.
|
||||
Para mais informações, consulte [a documentação oficial do Python](https://docs.python.org/3/library/__main__.html).
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ Mas você ainda precisa que ela seja executada/resolvida.
|
||||
|
||||
Para esses casos, em vez de declarar um parâmetro em uma *função de operação de rota* com `Depends`, você pode adicionar um argumento `dependencies` do tipo `list` ao decorador da operação de rota.
|
||||
|
||||
## Adicione `dependencies` ao decorador da operação de rota { #add-dependencies-to-the-path-operation-decorator }
|
||||
## Adicione `dependencies` ao *decorador da operação de rota* { #add-dependencies-to-the-path-operation-decorator }
|
||||
|
||||
O *decorador da operação de rota* recebe um argumento opcional `dependencies`.
|
||||
|
||||
@@ -32,7 +32,7 @@ Isso também pode ser útil para evitar confundir novos desenvolvedores que ao v
|
||||
|
||||
Neste exemplo utilizamos cabeçalhos personalizados inventados `X-Key` e `X-Token`.
|
||||
|
||||
Mas em situações reais, como implementações de segurança, você pode obter mais vantagens em usar as [Ferramentas de segurança integradas (o próximo capítulo)](../security/index.md){.internal-link target=_blank}.
|
||||
Mas em situações reais, como implementações de segurança, você pode obter mais vantagens em usar as [Ferramentas de segurança integradas (o próximo capítulo)](../security/index.md).
|
||||
|
||||
///
|
||||
|
||||
@@ -62,7 +62,7 @@ Então, você pode reutilizar uma dependência comum (que retorna um valor) que
|
||||
|
||||
## Dependências para um grupo de *operações de rota* { #dependencies-for-a-group-of-path-operations }
|
||||
|
||||
Mais a frente, quando você ler sobre como estruturar aplicações maiores ([Aplicações maiores - Múltiplos arquivos](../../tutorial/bigger-applications.md){.internal-link target=_blank}), possivelmente com múltiplos arquivos, você aprenderá a declarar um único parâmetro `dependencies` para um grupo de *operações de rota*.
|
||||
Mais a frente, quando você ler sobre como estruturar aplicações maiores ([Aplicações maiores - Múltiplos arquivos](../../tutorial/bigger-applications.md)), possivelmente com múltiplos arquivos, você aprenderá a declarar um único parâmetro `dependencies` para um grupo de *operações de rota*.
|
||||
|
||||
## Dependências globais { #global-dependencies }
|
||||
|
||||
|
||||
@@ -14,8 +14,8 @@ Garanta utilizar `yield` apenas uma vez por dependência.
|
||||
|
||||
Qualquer função que possa ser utilizada com:
|
||||
|
||||
* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager" class="external-link" target="_blank">`@contextlib.contextmanager`</a> ou
|
||||
* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager" class="external-link" target="_blank">`@contextlib.asynccontextmanager`</a>
|
||||
* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) ou
|
||||
* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager)
|
||||
|
||||
pode ser utilizada como uma dependência do **FastAPI**.
|
||||
|
||||
@@ -87,7 +87,7 @@ O **FastAPI** se encarrega de executá-las na ordem certa.
|
||||
|
||||
/// note | Detalhes Técnicos
|
||||
|
||||
Tudo isso funciona graças aos <a href="https://docs.python.org/3/library/contextlib.html" class="external-link" target="_blank">gerenciadores de contexto</a> do Python.
|
||||
Tudo isso funciona graças aos [gerenciadores de contexto](https://docs.python.org/3/library/contextlib.html) do Python.
|
||||
|
||||
O **FastAPI** utiliza eles internamente para alcançar isso.
|
||||
|
||||
@@ -111,7 +111,7 @@ Mas ela existe para ser utilizada caso você precise. 🤓
|
||||
|
||||
{* ../../docs_src/dependencies/tutorial008b_an_py310.py hl[18:22,31] *}
|
||||
|
||||
Se você quiser capturar exceções e criar uma resposta personalizada com base nisso, crie um [Manipulador de Exceções Customizado](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}.
|
||||
Se você quiser capturar exceções e criar uma resposta personalizada com base nisso, crie um [Manipulador de Exceções Customizado](../handling-errors.md#install-custom-exception-handlers).
|
||||
|
||||
## Dependências com `yield` e `except` { #dependencies-with-yield-and-except }
|
||||
|
||||
@@ -233,14 +233,14 @@ participant operation as Operação de Rota
|
||||
|
||||
Dependências com `yield` evoluíram ao longo do tempo para cobrir diferentes casos de uso e corrigir alguns problemas.
|
||||
|
||||
Se você quiser ver o que mudou em diferentes versões do FastAPI, você pode ler mais sobre isso no guia avançado, em [Dependências Avançadas - Dependências com `yield`, `HTTPException`, `except` e Tarefas de Background](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks){.internal-link target=_blank}.
|
||||
Se você quiser ver o que mudou em diferentes versões do FastAPI, você pode ler mais sobre isso no guia avançado, em [Dependências Avançadas - Dependências com `yield`, `HTTPException`, `except` e Tarefas de Background](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks).
|
||||
## Gerenciadores de contexto { #context-managers }
|
||||
|
||||
### O que são "Gerenciadores de Contexto" { #what-are-context-managers }
|
||||
|
||||
"Gerenciadores de Contexto" são qualquer um dos objetos Python que podem ser utilizados com a declaração `with`.
|
||||
|
||||
Por exemplo, <a href="https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files" class="external-link" target="_blank">você pode utilizar `with` para ler um arquivo</a>:
|
||||
Por exemplo, [você pode utilizar `with` para ler um arquivo](https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files):
|
||||
|
||||
```Python
|
||||
with open("./somefile.txt") as f:
|
||||
@@ -264,7 +264,7 @@ Se você está apenas iniciando com o **FastAPI** você pode querer pular isso p
|
||||
|
||||
///
|
||||
|
||||
Em Python, você pode criar Gerenciadores de Contexto ao <a href="https://docs.python.org/3/reference/datamodel.html#context-managers" class="external-link" target="_blank">criar uma classe com dois métodos: `__enter__()` e `__exit__()`</a>.
|
||||
Em Python, você pode criar Gerenciadores de Contexto ao [criar uma classe com dois métodos: `__enter__()` e `__exit__()`](https://docs.python.org/3/reference/datamodel.html#context-managers).
|
||||
|
||||
Você também pode usá-los dentro de dependências com `yield` do **FastAPI** ao utilizar
|
||||
`with` ou `async with` dentro da função da dependência:
|
||||
@@ -275,8 +275,8 @@ Você também pode usá-los dentro de dependências com `yield` do **FastAPI** a
|
||||
|
||||
Outra forma de criar um gerenciador de contexto é utilizando:
|
||||
|
||||
* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager" class="external-link" target="_blank">`@contextlib.contextmanager`</a> ou
|
||||
* <a href="https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager" class="external-link" target="_blank">`@contextlib.asynccontextmanager`</a>
|
||||
* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) ou
|
||||
* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager)
|
||||
|
||||
Para decorar uma função com um único `yield`.
|
||||
|
||||
|
||||
@@ -2,15 +2,15 @@
|
||||
|
||||
Para alguns tipos de aplicação você pode querer adicionar dependências para toda a aplicação.
|
||||
|
||||
De forma semelhante a [adicionar `dependencies` aos *decoradores de operação de rota*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, você pode adicioná-las à aplicação `FastAPI`.
|
||||
De forma semelhante a [adicionar `dependencies` aos *decoradores de operação de rota*](dependencies-in-path-operation-decorators.md), você pode adicioná-las à aplicação `FastAPI`.
|
||||
|
||||
Nesse caso, elas serão aplicadas a todas as *operações de rota* da aplicação:
|
||||
|
||||
{* ../../docs_src/dependencies/tutorial012_an_py310.py hl[17] *}
|
||||
|
||||
|
||||
E todos os conceitos apresentados na seção sobre [adicionar `dependencies` aos *decoradores de operação de rota*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank} ainda se aplicam, mas nesse caso, para todas as *operações de rota* da aplicação.
|
||||
E todos os conceitos apresentados na seção sobre [adicionar `dependencies` aos *decoradores de operação de rota*](dependencies-in-path-operation-decorators.md) ainda se aplicam, mas nesse caso, para todas as *operações de rota* da aplicação.
|
||||
|
||||
## Dependências para conjuntos de *operações de rota* { #dependencies-for-groups-of-path-operations }
|
||||
|
||||
Mais para a frente, quando você ler sobre como estruturar aplicações maiores ([Aplicações Maiores - Múltiplos Arquivos](../../tutorial/bigger-applications.md){.internal-link target=_blank}), possivelmente com múltiplos arquivos, você irá aprender a declarar um único parâmetro `dependencies` para um conjunto de *operações de rota*.
|
||||
Mais para a frente, quando você ler sobre como estruturar aplicações maiores ([Aplicações Maiores - Múltiplos Arquivos](../../tutorial/bigger-applications.md)), possivelmente com múltiplos arquivos, você irá aprender a declarar um único parâmetro `dependencies` para um conjunto de *operações de rota*.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Dependências { #dependencies }
|
||||
|
||||
O **FastAPI** possui um poderoso, mas intuitivo sistema de **<dfn title="também conhecida como: componentes, recursos, provedores, serviços, injetáveis">Injeção de Dependência</dfn>**.
|
||||
O **FastAPI** possui um poderoso, mas intuitivo sistema de **<dfn title="também conhecida como componentes, recursos, provedores, serviços, injetáveis">Injeção de Dependência</dfn>**.
|
||||
|
||||
Esse sistema foi pensado para ser fácil de usar, e permitir que qualquer desenvolvedor possa integrar facilmente outros componentes ao **FastAPI**.
|
||||
|
||||
@@ -57,7 +57,7 @@ FastAPI passou a suportar a notação `Annotated` (e começou a recomendá-la) n
|
||||
|
||||
Se você utiliza uma versão anterior, ocorrerão erros ao tentar utilizar `Annotated`.
|
||||
|
||||
Certifique-se de [Atualizar a versão do FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} para pelo menos 0.95.1 antes de usar `Annotated`.
|
||||
Certifique-se de [Atualizar a versão do FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions) para pelo menos 0.95.1 antes de usar `Annotated`.
|
||||
|
||||
///
|
||||
|
||||
@@ -152,7 +152,7 @@ Não faz diferença. O **FastAPI** sabe o que fazer.
|
||||
|
||||
/// note | Nota
|
||||
|
||||
Caso você não conheça, veja em [Async: *"Com Pressa?"*](../../async.md#in-a-hurry){.internal-link target=_blank} a sessão acerca de `async` e `await` na documentação.
|
||||
Caso você não conheça, veja em [Async: *"Com Pressa?"*](../../async.md#in-a-hurry) a sessão acerca de `async` e `await` na documentação.
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ Vamos imaginar que você tenha um banco de dados `fake_db` que recebe apenas dad
|
||||
|
||||
Por exemplo, ele não recebe objetos `datetime`, pois estes objetos não são compatíveis com JSON.
|
||||
|
||||
Então, um objeto `datetime` teria que ser convertido em um `str` contendo os dados no <a href="https://en.wikipedia.org/wiki/ISO_8601" class="external-link" target="_blank">formato ISO</a>.
|
||||
Então, um objeto `datetime` teria que ser convertido em um `str` contendo os dados no [formato ISO](https://en.wikipedia.org/wiki/ISO_8601).
|
||||
|
||||
Da mesma forma, este banco de dados não receberia um modelo Pydantic (um objeto com atributos), apenas um `dict`.
|
||||
|
||||
@@ -24,7 +24,7 @@ A função recebe um objeto, como um modelo Pydantic e retorna uma versão compa
|
||||
|
||||
Neste exemplo, ele converteria o modelo Pydantic em um `dict`, e o `datetime` em um `str`.
|
||||
|
||||
O resultado de chamar a função é algo que pode ser codificado com o padrão do Python <a href="https://docs.python.org/3/library/json.html#json.dumps" class="external-link" target="_blank">`json.dumps()`</a>.
|
||||
O resultado de chamar a função é algo que pode ser codificado com o padrão do Python [`json.dumps()`](https://docs.python.org/3/library/json.html#json.dumps).
|
||||
|
||||
A função não retorna um grande `str` contendo os dados no formato JSON (como uma string). Mas sim, retorna uma estrutura de dados padrão do Python (por exemplo, um `dict`) com valores e subvalores compatíveis com JSON.
|
||||
|
||||
|
||||
@@ -36,12 +36,12 @@ Aqui estão alguns dos tipos de dados adicionais que você pode usar:
|
||||
* `datetime.timedelta`:
|
||||
* O `datetime.timedelta` do Python.
|
||||
* Em requisições e respostas será representado como um `float` de segundos totais.
|
||||
* O Pydantic também permite representá-lo como uma "codificação ISO 8601 diferença de tempo", <a href="https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers" class="external-link" target="_blank">cheque a documentação para mais informações</a>.
|
||||
* O Pydantic também permite representá-lo como uma "codificação ISO 8601 diferença de tempo", [cheque a documentação para mais informações](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers).
|
||||
* `frozenset`:
|
||||
* Em requisições e respostas, será tratado da mesma forma que um `set`:
|
||||
* Nas requisições, uma lista será lida, eliminando duplicadas e convertendo-a em um `set`.
|
||||
* Nas respostas, o `set` será convertido para uma `list`.
|
||||
* O esquema gerado vai especificar que os valores do `set` são unicos (usando o `uniqueItems` do JSON Schema).
|
||||
* O esquema gerado vai especificar que os valores do `set` são únicos (usando o `uniqueItems` do JSON Schema).
|
||||
* `bytes`:
|
||||
* O `bytes` padrão do Python.
|
||||
* Em requisições e respostas será representado como uma `str`.
|
||||
@@ -49,7 +49,7 @@ Aqui estão alguns dos tipos de dados adicionais que você pode usar:
|
||||
* `Decimal`:
|
||||
* O `Decimal` padrão do Python.
|
||||
* Em requisições e respostas será representado como um `float`.
|
||||
* Você pode checar todos os tipos de dados válidos do Pydantic aqui: <a href="https://docs.pydantic.dev/latest/usage/types/types/" class="external-link" target="_blank">Tipos de dados do Pydantic</a>.
|
||||
* Você pode checar todos os tipos de dados válidos do Pydantic aqui: [Tipos de dados do Pydantic](https://docs.pydantic.dev/latest/usage/types/types/).
|
||||
|
||||
## Exemplo { #example }
|
||||
|
||||
@@ -57,6 +57,6 @@ Aqui está um exemplo de *operação de rota* com parâmetros utilizando-se de a
|
||||
|
||||
{* ../../docs_src/extra_data_types/tutorial001_an_py310.py hl[1,3,12:16] *}
|
||||
|
||||
Note que os parâmetros dentro da função tem seu tipo de dados natural, e você pode, por exemplo, realizar manipulações normais de data, como:
|
||||
Note que os parâmetros dentro da função têm seu tipo de dados natural, e você pode, por exemplo, realizar manipulações normais de data, como:
|
||||
|
||||
{* ../../docs_src/extra_data_types/tutorial001_an_py310.py hl[18:19] *}
|
||||
|
||||
@@ -12,7 +12,7 @@ Isso é especialmente o caso para modelos de usuários, porque:
|
||||
|
||||
Nunca armazene senhas em texto simples dos usuários. Sempre armazene uma "hash segura" que você pode verificar depois.
|
||||
|
||||
Se não souber, você aprenderá o que é uma "senha hash" nos [capítulos de segurança](security/simple-oauth2.md#password-hashing){.internal-link target=_blank}.
|
||||
Se não souber, você aprenderá o que é uma "senha hash" nos [capítulos de segurança](security/simple-oauth2.md#password-hashing).
|
||||
|
||||
///
|
||||
|
||||
@@ -162,11 +162,11 @@ Você pode declarar uma resposta como o `Union` de dois ou mais tipos, o que sig
|
||||
|
||||
Isso será definido no OpenAPI com `anyOf`.
|
||||
|
||||
Para fazer isso, use a anotação de tipo padrão do Python <a href="https://docs.python.org/3/library/typing.html#typing.Union" class="external-link" target="_blank">`typing.Union`</a>:
|
||||
Para fazer isso, use a anotação de tipo padrão do Python [`typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union):
|
||||
|
||||
/// note | Nota
|
||||
|
||||
Ao definir um <a href="https://docs.pydantic.dev/latest/concepts/types/#unions" class="external-link" target="_blank">`Union`</a>, inclua o tipo mais específico primeiro, seguido pelo tipo menos específico. No exemplo abaixo, o tipo mais específico `PlaneItem` vem antes de `CarItem` em `Union[PlaneItem, CarItem]`.
|
||||
Ao definir um [`Union`](https://docs.pydantic.dev/latest/concepts/types/#unions), inclua o tipo mais específico primeiro, seguido pelo tipo menos específico. No exemplo abaixo, o tipo mais específico `PlaneItem` vem antes de `CarItem` em `Union[PlaneItem, CarItem]`.
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -6,12 +6,12 @@ O arquivo FastAPI mais simples pode se parecer com:
|
||||
|
||||
Copie o conteúdo para um arquivo `main.py`.
|
||||
|
||||
Execute o servidor:
|
||||
Execute o servidor ao vivo:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid">main.py</u>
|
||||
$ <font color="#4E9A06">fastapi</font> dev
|
||||
|
||||
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server 🚀
|
||||
|
||||
@@ -58,7 +58,7 @@ Essa linha mostra a URL onde a sua aplicação está sendo servida, na sua máqu
|
||||
|
||||
### Confira { #check-it }
|
||||
|
||||
Abra o seu navegador em <a href="http://127.0.0.1:8000" class="external-link" target="_blank">http://127.0.0.1:8000</a>.
|
||||
Abra o seu navegador em [http://127.0.0.1:8000](http://127.0.0.1:8000).
|
||||
|
||||
Você verá essa resposta em JSON:
|
||||
|
||||
@@ -68,17 +68,17 @@ Você verá essa resposta em JSON:
|
||||
|
||||
### Documentação Interativa de APIs { #interactive-api-docs }
|
||||
|
||||
Agora vá para <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>.
|
||||
Agora vá para [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
|
||||
|
||||
Você verá a documentação interativa automática da API (fornecida por <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a>):
|
||||
Você verá a documentação interativa automática da API (fornecida por [Swagger UI](https://github.com/swagger-api/swagger-ui)):
|
||||
|
||||

|
||||
|
||||
### Documentação Alternativa de APIs { #alternative-api-docs }
|
||||
|
||||
E agora, vá para <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>.
|
||||
E agora, vá para [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc).
|
||||
|
||||
Você verá a documentação alternativa automática (fornecida por <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a>):
|
||||
Você verá a documentação alternativa automática (fornecida por [ReDoc](https://github.com/Rebilly/ReDoc)):
|
||||
|
||||

|
||||
|
||||
@@ -92,7 +92,7 @@ Um "*schema*" é uma definição ou descrição de algo. Não o código que o im
|
||||
|
||||
#### API "*schema*" { #api-schema }
|
||||
|
||||
Nesse caso, <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a> é uma especificação que determina como definir um *schema* da sua API.
|
||||
Nesse caso, [OpenAPI](https://github.com/OAI/OpenAPI-Specification) é uma especificação que determina como definir um *schema* da sua API.
|
||||
|
||||
Esta definição de *schema* inclui os paths da sua API, os parâmetros possíveis que eles usam, etc.
|
||||
|
||||
@@ -110,7 +110,7 @@ OpenAPI define um *schema* de API para sua API. E esse *schema* inclui definiç
|
||||
|
||||
Se você está curioso(a) sobre a aparência do *schema* bruto OpenAPI, o FastAPI gera automaticamente um JSON (*schema*) com as descrições de toda a sua API.
|
||||
|
||||
Você pode ver isso diretamente em: <a href="http://127.0.0.1:8000/openapi.json" class="external-link" target="_blank">http://127.0.0.1:8000/openapi.json</a>.
|
||||
Você pode ver isso diretamente em: [http://127.0.0.1:8000/openapi.json](http://127.0.0.1:8000/openapi.json).
|
||||
|
||||
Ele mostrará um JSON começando com algo como:
|
||||
|
||||
@@ -143,9 +143,58 @@ E existem dezenas de alternativas, todas baseadas em OpenAPI. Você pode facilme
|
||||
|
||||
Você também pode usá-lo para gerar código automaticamente para clientes que se comunicam com sua API. Por exemplo, aplicativos front-end, móveis ou IoT.
|
||||
|
||||
### Configure o `entrypoint` da aplicação em `pyproject.toml` { #configure-the-app-entrypoint-in-pyproject-toml }
|
||||
|
||||
Você pode configurar onde sua aplicação está localizada em um arquivo `pyproject.toml`, assim:
|
||||
|
||||
```toml
|
||||
[tool.fastapi]
|
||||
entrypoint = "main:app"
|
||||
```
|
||||
|
||||
Esse `entrypoint` dirá ao comando `fastapi` que ele deve importar a aplicação assim:
|
||||
|
||||
```python
|
||||
from main import app
|
||||
```
|
||||
|
||||
Se o seu código estiver estruturado assim:
|
||||
|
||||
```
|
||||
.
|
||||
├── backend
|
||||
│ ├── main.py
|
||||
│ ├── __init__.py
|
||||
```
|
||||
|
||||
Então você definiria o `entrypoint` como:
|
||||
|
||||
```toml
|
||||
[tool.fastapi]
|
||||
entrypoint = "backend.main:app"
|
||||
```
|
||||
|
||||
o que seria equivalente a:
|
||||
|
||||
```python
|
||||
from backend.main import app
|
||||
```
|
||||
|
||||
### `fastapi dev` com path { #fastapi-dev-with-path }
|
||||
|
||||
Você também pode passar o path do arquivo para o comando `fastapi dev`, e ele vai deduzir o objeto de aplicação FastAPI a ser usado:
|
||||
|
||||
```console
|
||||
$ fastapi dev main.py
|
||||
```
|
||||
|
||||
Mas você teria que lembrar de passar o path correto toda vez que chamar o comando `fastapi`.
|
||||
|
||||
Além disso, outras ferramentas podem não conseguir encontrá-la, por exemplo, a [Extensão do VS Code](../editor-support.md) ou a [FastAPI Cloud](https://fastapicloud.com), então é recomendado usar o `entrypoint` no `pyproject.toml`.
|
||||
|
||||
### Faça o deploy da sua aplicação (opcional) { #deploy-your-app-optional }
|
||||
|
||||
Você pode, opcionalmente, fazer o deploy da sua aplicação FastAPI na <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>; acesse e entre na lista de espera, se ainda não entrou. 🚀
|
||||
Você pode, opcionalmente, fazer o deploy da sua aplicação FastAPI na [FastAPI Cloud](https://fastapicloud.com); acesse e entre na lista de espera, se ainda não entrou. 🚀
|
||||
|
||||
Se você já tem uma conta na **FastAPI Cloud** (nós convidamos você da lista de espera 😉), pode fazer o deploy da sua aplicação com um único comando.
|
||||
|
||||
@@ -191,7 +240,7 @@ Deploying to FastAPI Cloud...
|
||||
|
||||
`FastAPI` é uma classe que herda diretamente de `Starlette`.
|
||||
|
||||
Você pode usar todas as funcionalidades do <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a> com `FastAPI` também.
|
||||
Você pode usar todas as funcionalidades do [Starlette](https://www.starlette.dev/) com `FastAPI` também.
|
||||
|
||||
///
|
||||
|
||||
@@ -312,7 +361,7 @@ Por exemplo, ao usar GraphQL, você normalmente executa todas as ações usando
|
||||
|
||||
///
|
||||
|
||||
### Passo 4: defina a função de operação de rota { #step-4-define-the-path-operation-function }
|
||||
### Passo 4: defina a **função de operação de rota** { #step-4-define-the-path-operation-function }
|
||||
|
||||
Esta é a nossa "**função de operação de rota**":
|
||||
|
||||
@@ -336,7 +385,7 @@ Você também pode defini-la como uma função normal em vez de `async def`:
|
||||
|
||||
/// note | Nota
|
||||
|
||||
Se você não sabe a diferença, verifique o [Async: *"Com pressa?"*](../async.md#in-a-hurry){.internal-link target=_blank}.
|
||||
Se você não sabe a diferença, verifique o [Async: *"Com pressa?"*](../async.md#in-a-hurry).
|
||||
|
||||
///
|
||||
|
||||
@@ -352,11 +401,11 @@ Existem muitos outros objetos e modelos que serão convertidos automaticamente p
|
||||
|
||||
### Passo 6: Faça o deploy { #step-6-deploy-it }
|
||||
|
||||
Faça o deploy da sua aplicação para a **<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** com um comando: `fastapi deploy`. 🎉
|
||||
Faça o deploy da sua aplicação para a **[FastAPI Cloud](https://fastapicloud.com)** com um comando: `fastapi deploy`. 🎉
|
||||
|
||||
#### Sobre o FastAPI Cloud { #about-fastapi-cloud }
|
||||
|
||||
A **<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** é construída pelo mesmo autor e equipe por trás do **FastAPI**.
|
||||
A **[FastAPI Cloud](https://fastapicloud.com)** é construída pelo mesmo autor e equipe por trás do **FastAPI**.
|
||||
|
||||
Ela simplifica o processo de **construir**, **fazer deploy** e **acessar** uma API com o mínimo de esforço.
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ Mas caso você precise, para um cenário mais complexo, você pode adicionar hea
|
||||
|
||||
## Instale manipuladores de exceções customizados { #install-custom-exception-handlers }
|
||||
|
||||
Você pode adicionar manipuladores de exceção customizados com <a href="https://www.starlette.dev/exceptions/" class="external-link" target="_blank">a mesma seção de utilidade de exceções presentes no Starlette</a>.
|
||||
Você pode adicionar manipuladores de exceção customizados com [a mesma seção de utilidade de exceções presentes no Starlette](https://www.starlette.dev/exceptions/).
|
||||
|
||||
Digamos que você tenha uma exceção customizada `UnicornException` que você (ou uma biblioteca que você use) precise lançar (`raise`).
|
||||
|
||||
|
||||
@@ -10,12 +10,12 @@ Ele também foi construído para servir como uma referência futura, então voc
|
||||
|
||||
Todos os blocos de código podem ser copiados e utilizados diretamente (eles são, na verdade, arquivos Python testados).
|
||||
|
||||
Para rodar qualquer um dos exemplos, copie o código para um arquivo `main.py`, e inicie o `fastapi dev` com:
|
||||
Para rodar qualquer um dos exemplos, copie o código para um arquivo `main.py`, e inicie o `fastapi dev`:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid">main.py</u>
|
||||
$ <font color="#4E9A06">fastapi</font> dev
|
||||
|
||||
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server 🚀
|
||||
|
||||
@@ -62,7 +62,7 @@ Usá-lo em seu editor é o que realmente te mostra os benefícios do FastAPI, ve
|
||||
|
||||
O primeiro passo é instalar o FastAPI.
|
||||
|
||||
Certifique-se de criar um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ativá-lo e então **instalar o FastAPI**:
|
||||
Certifique-se de criar um [ambiente virtual](../virtual-environments.md), ativá-lo e então **instalar o FastAPI**:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
@@ -76,7 +76,7 @@ $ pip install "fastapi[standard]"
|
||||
|
||||
/// note | Nota
|
||||
|
||||
Quando você instala com `pip install "fastapi[standard]"`, ele vem com algumas dependências opcionais padrão, incluindo `fastapi-cloud-cli`, que permite fazer deploy na <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>.
|
||||
Quando você instala com `pip install "fastapi[standard]"`, ele vem com algumas dependências opcionais padrão, incluindo `fastapi-cloud-cli`, que permite fazer deploy na [FastAPI Cloud](https://fastapicloud.com).
|
||||
|
||||
Se você não quiser ter essas dependências opcionais, pode instalar `pip install fastapi` em vez disso.
|
||||
|
||||
@@ -84,6 +84,12 @@ Se você quiser instalar as dependências padrão, mas sem o `fastapi-cloud-cli`
|
||||
|
||||
///
|
||||
|
||||
/// tip | Dica
|
||||
|
||||
O FastAPI tem uma [extensão oficial para o VS Code](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (e para o Cursor), que fornece vários recursos, incluindo um explorador de operações de rota, busca de operações de rota, navegação CodeLens em testes (ir para a definição a partir dos testes) e deploy e logs da FastAPI Cloud, tudo direto do seu editor.
|
||||
|
||||
///
|
||||
|
||||
## Guia Avançado de Usuário { #advanced-user-guide }
|
||||
|
||||
Há também um **Guia Avançado de Usuário** que você pode ler após esse **Tutorial - Guia de Usuário**.
|
||||
|
||||
@@ -14,7 +14,7 @@ Você pode definir os seguintes campos que são usados na especificação OpenAP
|
||||
| `version` | `string` | A versão da API. Esta é a versão da sua aplicação, não do OpenAPI. Por exemplo, `2.5.0`. |
|
||||
| `terms_of_service` | `str` | Uma URL para os Termos de Serviço da API. Se fornecido, deve ser uma URL. |
|
||||
| `contact` | `dict` | As informações de contato da API exposta. Pode conter vários campos. <details><summary>Campos de <code>contact</code></summary><table><thead><tr><th>Parâmetro</th><th>Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td>O nome identificador da pessoa/organização de contato.</td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>A URL que aponta para as informações de contato. DEVE estar no formato de uma URL.</td></tr><tr><td><code>email</code></td><td><code>str</code></td><td>O endereço de e-mail da pessoa/organização de contato. DEVE estar no formato de um endereço de e-mail.</td></tr></tbody></table></details> |
|
||||
| `license_info` | `dict` | As informações de licença para a API exposta. Ela pode conter vários campos. <details><summary>Campos de <code>license_info</code></summary><table><thead><tr><th>Parâmetro</th><th>Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td><strong>OBRIGATÓRIO</strong> (se um <code>license_info</code> for definido). O nome da licença usada para a API.</td></tr><tr><td><code>identifier</code></td><td><code>str</code></td><td>Uma expressão de licença <a href="https://spdx.org/licenses/" class="external-link" target="_blank">SPDX</a> para a API. O campo <code>identifier</code> é mutuamente exclusivo do campo <code>url</code>. <small>Disponível desde OpenAPI 3.1.0, FastAPI 0.99.0.</small></td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>Uma URL para a licença usada para a API. DEVE estar no formato de uma URL.</td></tr></tbody></table></details> |
|
||||
| `license_info` | `dict` | As informações de licença para a API exposta. Ela pode conter vários campos. <details><summary>Campos de <code>license_info</code></summary><table><thead><tr><th>Parâmetro</th><th>Tipo</th><th>Descrição</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td><strong>OBRIGATÓRIO</strong> (se um <code>license_info</code> for definido). O nome da licença usada para a API.</td></tr><tr><td><code>identifier</code></td><td><code>str</code></td><td>Uma expressão de licença [SPDX](https://spdx.org/licenses/) para a API. O campo <code>identifier</code> é mutuamente exclusivo do campo <code>url</code>. <small>Disponível desde OpenAPI 3.1.0, FastAPI 0.99.0.</small></td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>Uma URL para a licença usada para a API. DEVE estar no formato de uma URL.</td></tr></tbody></table></details> |
|
||||
|
||||
Você pode defini-los da seguinte maneira:
|
||||
|
||||
@@ -76,7 +76,7 @@ Use o parâmetro `tags` com suas *operações de rota* (e `APIRouter`s) para atr
|
||||
|
||||
/// info | Informação
|
||||
|
||||
Leia mais sobre tags em [Configuração de operação de rota](path-operation-configuration.md#tags){.internal-link target=_blank}.
|
||||
Leia mais sobre tags em [Configuração de operação de rota](path-operation-configuration.md#tags).
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ Um "middleware" é uma função que manipula cada **requisição** antes de ser
|
||||
|
||||
Se você tiver dependências com `yield`, o código de saída será executado *depois* do middleware.
|
||||
|
||||
Se houver alguma tarefa em segundo plano (abordada na seção [Tarefas em segundo plano](background-tasks.md){.internal-link target=_blank}, que você verá mais adiante), ela será executada *depois* de todo o middleware.
|
||||
Se houver alguma tarefa em segundo plano (abordada na seção [Tarefas em segundo plano](background-tasks.md), que você verá mais adiante), ela será executada *depois* de todo o middleware.
|
||||
|
||||
///
|
||||
|
||||
@@ -35,9 +35,9 @@ A função middleware recebe:
|
||||
|
||||
/// tip | Dica
|
||||
|
||||
Tenha em mente que cabeçalhos proprietários personalizados podem ser adicionados <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">usando o prefixo `X-`</a>.
|
||||
Tenha em mente que cabeçalhos proprietários personalizados podem ser adicionados [usando o prefixo `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers).
|
||||
|
||||
Mas se você tiver cabeçalhos personalizados desejando que um cliente em um navegador esteja apto a ver, você precisa adicioná-los às suas configurações CORS ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}) usando o parâmetro `expose_headers` documentado em <a href="https://www.starlette.dev/middleware/#corsmiddleware" class="external-link" target="_blank">Documentação CORS da Starlette</a>.
|
||||
Mas se você tiver cabeçalhos personalizados desejando que um cliente em um navegador esteja apto a ver, você precisa adicioná-los às suas configurações CORS ([CORS (Cross-Origin Resource Sharing)](cors.md)) usando o parâmetro `expose_headers` documentado na [Documentação CORS da Starlette](https://www.starlette.dev/middleware/#corsmiddleware).
|
||||
|
||||
///
|
||||
|
||||
@@ -61,7 +61,7 @@ Por exemplo, você pode adicionar um cabeçalho personalizado `X-Process-Time` c
|
||||
|
||||
/// tip | Dica
|
||||
|
||||
Aqui usamos <a href="https://docs.python.org/3/library/time.html#time.perf_counter" class="external-link" target="_blank">`time.perf_counter()`</a> em vez de `time.time()` porque ele pode ser mais preciso para esses casos de uso. 🤓
|
||||
Aqui usamos [`time.perf_counter()`](https://docs.python.org/3/library/time.html#time.perf_counter) em vez de `time.time()` porque ele pode ser mais preciso para esses casos de uso. 🤓
|
||||
|
||||
///
|
||||
|
||||
@@ -90,6 +90,6 @@ Esse comportamento de empilhamento garante que os middlewares sejam executados e
|
||||
|
||||
## Outros middlewares { #other-middlewares }
|
||||
|
||||
Mais tarde, você pode ler mais sobre outros middlewares no [Guia do usuário avançado: Middleware avançado](../advanced/middleware.md){.internal-link target=_blank}.
|
||||
Mais tarde, você pode ler mais sobre outros middlewares no [Guia do usuário avançado: Middleware avançado](../advanced/middleware.md).
|
||||
|
||||
Você lerá sobre como manipular <abbr title="Cross-Origin Resource Sharing">CORS</abbr> com um middleware na próxima seção.
|
||||
|
||||
@@ -40,7 +40,7 @@ Eles serão adicionados ao esquema OpenAPI e usados pelas interfaces de document
|
||||
|
||||
### Tags com Enums { #tags-with-enums }
|
||||
|
||||
Se você tem uma grande aplicação, você pode acabar acumulando **várias tags**, e você gostaria de ter certeza de que você sempre usa a **mesma tag** para *operações de rota* relacionadas.
|
||||
Se você tem uma grande aplicação, você pode acabar acumulando **várias tags**, e você gostaria de ter certeza de que você sempre usa a ** mesma tag** para *operações de rota* relacionadas.
|
||||
|
||||
Nestes casos, pode fazer sentido armazenar as tags em um `Enum`.
|
||||
|
||||
@@ -58,7 +58,7 @@ Você pode adicionar um `summary` e uma `description`:
|
||||
|
||||
Como as descrições tendem a ser longas e cobrir várias linhas, você pode declarar a descrição da *operação de rota* na <dfn title="uma string de várias linhas como a primeira expressão dentro de uma função (não atribuída a nenhuma variável) usada para documentação">docstring</dfn> da função e o **FastAPI** irá lê-la de lá.
|
||||
|
||||
Você pode escrever <a href="https://en.wikipedia.org/wiki/Markdown" class="external-link" target="_blank">Markdown</a> na docstring, ele será interpretado e exibido corretamente (levando em conta a indentação da docstring).
|
||||
Você pode escrever [Markdown](https://en.wikipedia.org/wiki/Markdown) na docstring, ele será interpretado e exibido corretamente (levando em conta a indentação da docstring).
|
||||
|
||||
{* ../../docs_src/path_operation_configuration/tutorial004_py310.py hl[17:25] *}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ O FastAPI adicionou suporte a `Annotated` (e passou a recomendá-lo) na versão
|
||||
|
||||
Se você tiver uma versão mais antiga, verá erros ao tentar usar `Annotated`.
|
||||
|
||||
Certifique-se de [Atualizar a versão do FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} para pelo menos 0.95.1 antes de usar `Annotated`.
|
||||
Certifique-se de [Atualizar a versão do FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions) para pelo menos 0.95.1 antes de usar `Annotated`.
|
||||
|
||||
///
|
||||
|
||||
@@ -122,7 +122,7 @@ E o mesmo para <abbr title="less than – menor que"><code>lt</code></abbr>.
|
||||
|
||||
## Recapitulando { #recap }
|
||||
|
||||
Com `Query`, `Path` (e outras que você ainda não viu) você pode declarar metadados e validações de string do mesmo modo que em [Parâmetros de consulta e validações de string](query-params-str-validations.md){.internal-link target=_blank}.
|
||||
Com `Query`, `Path` (e outras que você ainda não viu) você pode declarar metadados e validações de string do mesmo modo que em [Parâmetros de consulta e validações de string](query-params-str-validations.md).
|
||||
|
||||
E você também pode declarar validações numéricas:
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ Você pode declarar "parâmetros" ou "variáveis" de path com a mesma sintaxe us
|
||||
|
||||
O valor do parâmetro de path `item_id` será passado para a sua função como o argumento `item_id`.
|
||||
|
||||
Então, se você executar este exemplo e acessar <a href="http://127.0.0.1:8000/items/foo" class="external-link" target="_blank">http://127.0.0.1:8000/items/foo</a>, você verá uma resposta:
|
||||
Então, se você executar este exemplo e acessar [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo), você verá uma resposta:
|
||||
|
||||
```JSON
|
||||
{"item_id":"foo"}
|
||||
@@ -26,7 +26,7 @@ Isso fornecerá suporte do editor dentro da sua função, com verificações de
|
||||
|
||||
## Dados <dfn title="também conhecido como: serialização, parsing, marshalling">conversão</dfn> { #data-conversion }
|
||||
|
||||
Se você executar este exemplo e abrir seu navegador em <a href="http://127.0.0.1:8000/items/3" class="external-link" target="_blank">http://127.0.0.1:8000/items/3</a>, você verá uma resposta:
|
||||
Se você executar este exemplo e abrir seu navegador em [http://127.0.0.1:8000/items/3](http://127.0.0.1:8000/items/3), você verá uma resposta:
|
||||
|
||||
```JSON
|
||||
{"item_id":3}
|
||||
@@ -40,7 +40,7 @@ Então, com essa declaração de tipo, o **FastAPI** fornece <dfn title="convert
|
||||
|
||||
## Validação de dados { #data-validation }
|
||||
|
||||
Mas se você for no navegador para <a href="http://127.0.0.1:8000/items/foo" class="external-link" target="_blank">http://127.0.0.1:8000/items/foo</a>, verá um bom erro HTTP:
|
||||
Mas se você for no navegador para [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo), verá um bom erro HTTP:
|
||||
|
||||
```JSON
|
||||
{
|
||||
@@ -60,7 +60,7 @@ Mas se você for no navegador para <a href="http://127.0.0.1:8000/items/foo" cla
|
||||
|
||||
porque o parâmetro de path `item_id` tinha o valor `"foo"`, que não é um `int`.
|
||||
|
||||
O mesmo erro apareceria se você fornecesse um `float` em vez de um `int`, como em: <a href="http://127.0.0.1:8000/items/4.2" class="external-link" target="_blank">http://127.0.0.1:8000/items/4.2</a>
|
||||
O mesmo erro apareceria se você fornecesse um `float` em vez de um `int`, como em: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)
|
||||
|
||||
/// check | Verifique
|
||||
Então, com a mesma declaração de tipo do Python, o **FastAPI** fornece validação de dados.
|
||||
@@ -72,7 +72,7 @@ Isso é incrivelmente útil ao desenvolver e depurar código que interage com su
|
||||
|
||||
## Documentação { #documentation }
|
||||
|
||||
E quando você abrir seu navegador em <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>, você verá documentação automática, interativa, da API como:
|
||||
E quando você abrir seu navegador em [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs), você verá documentação automática, interativa, da API como:
|
||||
|
||||
<img src="/img/tutorial/path-params/image01.png">
|
||||
|
||||
@@ -84,9 +84,9 @@ Observe que o parâmetro de path está declarado como um inteiro.
|
||||
|
||||
## Benefícios baseados em padrões, documentação alternativa { #standards-based-benefits-alternative-documentation }
|
||||
|
||||
E como o schema gerado é do padrão <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md" class="external-link" target="_blank">OpenAPI</a>, existem muitas ferramentas compatíveis.
|
||||
E como o schema gerado é do padrão [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md), existem muitas ferramentas compatíveis.
|
||||
|
||||
Por causa disso, o próprio **FastAPI** fornece uma documentação alternativa da API (usando ReDoc), que você pode acessar em <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>:
|
||||
Por causa disso, o próprio **FastAPI** fornece uma documentação alternativa da API (usando ReDoc), que você pode acessar em [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc):
|
||||
|
||||
<img src="/img/tutorial/path-params/image02.png">
|
||||
|
||||
@@ -94,7 +94,7 @@ Da mesma forma, existem muitas ferramentas compatíveis. Incluindo ferramentas d
|
||||
|
||||
## Pydantic { #pydantic }
|
||||
|
||||
Toda a validação de dados é realizada nos bastidores pelo <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a>, então você recebe todos os benefícios disso. E você sabe que está em boas mãos.
|
||||
Toda a validação de dados é realizada nos bastidores pelo [Pydantic](https://docs.pydantic.dev/), então você recebe todos os benefícios disso. E você sabe que está em boas mãos.
|
||||
|
||||
Você pode usar as mesmas declarações de tipo com `str`, `float`, `bool` e muitos outros tipos de dados complexos.
|
||||
|
||||
@@ -122,7 +122,7 @@ A primeira sempre será usada, já que o path corresponde primeiro.
|
||||
|
||||
## Valores predefinidos { #predefined-values }
|
||||
|
||||
Se você tem uma *operação de rota* que recebe um *parâmetro de path*, mas quer que os valores válidos possíveis do *parâmetro de path* sejam predefinidos, você pode usar um <abbr title="Enumeration - Enumeração">`Enum`</abbr> padrão do Python.
|
||||
Se você tem uma *operação de rota* que recebe um *parâmetro de path*, mas quer que os valores válidos possíveis do *parâmetro de path* sejam predefinidos, você pode usar um <abbr title="Enumeração">`Enum`</abbr> padrão do Python.
|
||||
|
||||
### Crie uma classe `Enum` { #create-an-enum-class }
|
||||
|
||||
|
||||
@@ -35,13 +35,13 @@ O FastAPI adicionou suporte a `Annotated` (e passou a recomendá-lo) na versão
|
||||
|
||||
Se você tiver uma versão mais antiga, teria erros ao tentar usar `Annotated`.
|
||||
|
||||
Certifique-se de [Atualizar a versão do FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} para pelo menos 0.95.1 antes de usar `Annotated`.
|
||||
Certifique-se de [Atualizar a versão do FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions) para pelo menos 0.95.1 antes de usar `Annotated`.
|
||||
|
||||
///
|
||||
|
||||
## Use `Annotated` no tipo do parâmetro `q` { #use-annotated-in-the-type-for-the-q-parameter }
|
||||
|
||||
Lembra que eu disse antes que `Annotated` pode ser usado para adicionar metadados aos seus parâmetros na [Introdução aos tipos do Python](../python-types.md#type-hints-with-metadata-annotations){.internal-link target=_blank}?
|
||||
Lembra que eu disse antes que `Annotated` pode ser usado para adicionar metadados aos seus parâmetros na [Introdução aos tipos do Python](../python-types.md#type-hints-with-metadata-annotations)?
|
||||
|
||||
Agora é a hora de usá-lo com FastAPI. 🚀
|
||||
|
||||
@@ -158,7 +158,7 @@ Você poderia chamar essa mesma função em outros lugares sem FastAPI, e ela fu
|
||||
|
||||
Quando você não usa `Annotated` e em vez disso usa o estilo de valor padrão (antigo), se você chamar essa função sem FastAPI em outros lugares, terá que lembrar de passar os argumentos para a função para que funcione corretamente, caso contrário os valores serão diferentes do esperado (por exemplo, `QueryInfo` ou algo parecido em vez de `str`). E seu editor não vai avisar, e o Python também não vai reclamar ao executar a função, apenas quando as operações internas falharem.
|
||||
|
||||
Como `Annotated` pode ter mais de uma anotação de metadados, você agora pode até usar a mesma função com outras ferramentas, como o <a href="https://typer.tiangolo.com/" class="external-link" target="_blank">Typer</a>. 🚀
|
||||
Como `Annotated` pode ter mais de uma anotação de metadados, você agora pode até usar a mesma função com outras ferramentas, como o [Typer](https://typer.tiangolo.com/). 🚀
|
||||
|
||||
## Adicione mais validações { #add-more-validations }
|
||||
|
||||
@@ -370,11 +370,11 @@ Podem existir casos em que você precise fazer alguma validação personalizada
|
||||
|
||||
Nesses casos, você pode usar uma função validadora personalizada que é aplicada após a validação normal (por exemplo, depois de validar que o valor é uma `str`).
|
||||
|
||||
Você pode fazer isso usando o <a href="https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator" class="external-link" target="_blank">`AfterValidator` do Pydantic</a> dentro de `Annotated`.
|
||||
Você pode fazer isso usando o [`AfterValidator` do Pydantic](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) dentro de `Annotated`.
|
||||
|
||||
/// tip | Dica
|
||||
|
||||
O Pydantic também tem <a href="https://docs.pydantic.dev/latest/concepts/validators/#field-before-validator" class="external-link" target="_blank">`BeforeValidator`</a> e outros. 🤓
|
||||
O Pydantic também tem [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-before-validator) e outros. 🤓
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -129,7 +129,7 @@ Porém, quando você quiser fazer com que o parâmetro de consulta seja obrigat
|
||||
|
||||
{* ../../docs_src/query_params/tutorial005_py310.py hl[6:7] *}
|
||||
|
||||
Aqui o parâmetro de consulta `needy` é um valor obrigatório, do tipo `str`.
|
||||
Aqui o parâmetro da consulta `needy` é um valor obrigatório, do tipo `str`.
|
||||
|
||||
Se você abrir no seu navegador a URL:
|
||||
|
||||
@@ -182,6 +182,6 @@ Nesse caso, existem 3 parâmetros de consulta:
|
||||
|
||||
/// tip | Dica
|
||||
|
||||
Você também poderia usar `Enum` da mesma forma que com [Path Parameters](path-params.md#predefined-values){.internal-link target=_blank}.
|
||||
Você também poderia usar `Enum`s da mesma forma que com [Parâmetros de rota](path-params.md#predefined-values).
|
||||
|
||||
///
|
||||
|
||||
@@ -4,9 +4,9 @@ Você pode definir arquivos para serem enviados pelo cliente usando `File`.
|
||||
|
||||
/// info | Informação
|
||||
|
||||
Para receber arquivos enviados, primeiro instale o <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>.
|
||||
Para receber arquivos enviados, primeiro instale [`python-multipart`](https://github.com/Kludex/python-multipart).
|
||||
|
||||
Garanta que você criou um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, o ativou e então o instalou, por exemplo:
|
||||
Garanta que você criou um [ambiente virtual](../virtual-environments.md), o ativou e então o instalou, por exemplo:
|
||||
|
||||
```console
|
||||
$ pip install python-multipart
|
||||
@@ -63,8 +63,8 @@ Utilizar `UploadFile` tem várias vantagens sobre `bytes`:
|
||||
* Um arquivo armazenado na memória até um limite máximo de tamanho, e após passar esse limite, ele será armazenado no disco.
|
||||
* Isso significa que funcionará bem para arquivos grandes como imagens, vídeos, binários grandes, etc., sem consumir toda a memória.
|
||||
* Você pode receber metadados do arquivo enviado.
|
||||
* Ele tem uma <a href="https://docs.python.org/3/glossary.html#term-file-like-object" class="external-link" target="_blank">file-like</a> interface `assíncrona`.
|
||||
* Ele expõe um objeto python <a href="https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile" class="external-link" target="_blank">`SpooledTemporaryFile`</a> que você pode passar diretamente para outras bibliotecas que esperam um objeto semelhante a um arquivo("file-like").
|
||||
* Ele tem uma [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) interface `assíncrona`.
|
||||
* Ele expõe um objeto python [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) que você pode passar diretamente para outras bibliotecas que esperam um objeto semelhante a um arquivo.
|
||||
|
||||
### `UploadFile` { #uploadfile }
|
||||
|
||||
@@ -72,7 +72,7 @@ Utilizar `UploadFile` tem várias vantagens sobre `bytes`:
|
||||
|
||||
* `filename`: Uma `str` com o nome do arquivo original que foi enviado (por exemplo, `myimage.jpg`).
|
||||
* `content_type`: Uma `str` com o tipo de conteúdo (MIME type / media type) (por exemplo, `image/jpeg`).
|
||||
* `file`: Um <a href="https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile" class="external-link" target="_blank">`SpooledTemporaryFile`</a> (um <a href="https://docs.python.org/3/glossary.html#term-file-like-object" class="external-link" target="_blank">file-like</a> objeto). Este é o objeto de arquivo Python que você pode passar diretamente para outras funções ou bibliotecas que esperam um objeto semelhante a um arquivo("file-like").
|
||||
* `file`: Um [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) (um [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) objeto). Este é o objeto de arquivo Python que você pode passar diretamente para outras funções ou bibliotecas que esperam um objeto semelhante a um arquivo.
|
||||
|
||||
`UploadFile` tem os seguintes métodos `assíncronos`. Todos eles chamam os métodos de arquivo correspondentes por baixo dos panos (usando o `SpooledTemporaryFile` interno).
|
||||
|
||||
@@ -121,7 +121,7 @@ Dados de formulários normalmente são codificados usando o "media type" `applic
|
||||
|
||||
Mas quando o formulário inclui arquivos, ele é codificado como `multipart/form-data`. Se você usar `File`, o **FastAPI** saberá que tem que pegar os arquivos da parte correta do corpo da requisição.
|
||||
|
||||
Se você quiser ler mais sobre essas codificações e campos de formulário, vá para a <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network - Rede de Desenvolvedores da Mozilla">MDN</abbr> web docs para <code>POST</code></a>.
|
||||
Se você quiser ler mais sobre essas codificações e campos de formulário, vá para a [<abbr title="Mozilla Developer Network - Rede de Desenvolvedores da Mozilla">MDN</abbr> web docs para `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -4,9 +4,9 @@ Você pode utilizar **Modelos Pydantic** para declarar **campos de formulários*
|
||||
|
||||
/// info | Informação
|
||||
|
||||
Para utilizar formulários, instale primeiramente o <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>.
|
||||
Para utilizar formulários, instale primeiramente o [`python-multipart`](https://github.com/Kludex/python-multipart).
|
||||
|
||||
Certifique-se de criar um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ativá-lo, e então instalar. Por exemplo:
|
||||
Certifique-se de criar um [ambiente virtual](../virtual-environments.md), ativá-lo, e então instalar. Por exemplo:
|
||||
|
||||
```console
|
||||
$ pip install python-multipart
|
||||
|
||||
@@ -4,9 +4,9 @@ Você pode definir arquivos e campos de formulário ao mesmo tempo usando `File`
|
||||
|
||||
/// info | Informação
|
||||
|
||||
Para receber arquivos carregados e/ou dados de formulário, primeiro instale <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>.
|
||||
Para receber arquivos carregados e/ou dados de formulário, primeiro instale [`python-multipart`](https://github.com/Kludex/python-multipart).
|
||||
|
||||
Certifique-se de criar um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ativá-lo e então instalar, por exemplo:
|
||||
Certifique-se de criar um [ambiente virtual](../virtual-environments.md), ativá-lo e então instalar, por exemplo:
|
||||
|
||||
```console
|
||||
$ pip install python-multipart
|
||||
|
||||
@@ -4,9 +4,9 @@ Quando você precisar receber campos de formulário em vez de JSON, você pode u
|
||||
|
||||
/// info | Informação
|
||||
|
||||
Para usar formulários, primeiro instale <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a>.
|
||||
Para usar formulários, primeiro instale [`python-multipart`](https://github.com/Kludex/python-multipart).
|
||||
|
||||
Certifique-se de criar um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ativá-lo e então instalá-lo, por exemplo:
|
||||
Certifique-se de criar um [ambiente virtual](../virtual-environments.md), ativá-lo e então instalá-lo, por exemplo:
|
||||
|
||||
```console
|
||||
$ pip install python-multipart
|
||||
@@ -56,7 +56,7 @@ 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.
|
||||
|
||||
Se você quiser ler mais sobre essas codificações e campos de formulário, vá para o <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network – Rede de Desenvolvedores da Mozilla">MDN</abbr> web docs para <code>POST</code></a>.
|
||||
Se você quiser ler mais sobre essas codificações e campos de formulário, vá para o [<abbr title="Mozilla Developer Network - Rede de Desenvolvedores da Mozilla">MDN</abbr> web docs para `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ O FastAPI usará este tipo de retorno para:
|
||||
* Adicionar um **JSON Schema** para a resposta, na *operação de rota* do OpenAPI.
|
||||
* Isso será usado pela **documentação automática**.
|
||||
* Também será usado por ferramentas de geração automática de código do cliente.
|
||||
* **Serializar** os dados retornados para JSON usando Pydantic, que é escrito em **Rust**, então será **muito mais rápido**.
|
||||
|
||||
Mas o mais importante:
|
||||
|
||||
@@ -73,9 +74,9 @@ Aqui estamos declarando um modelo `UserIn`, ele conterá uma senha em texto simp
|
||||
|
||||
/// info | Informação
|
||||
|
||||
Para usar `EmailStr`, primeiro instale <a href="https://github.com/JoshData/python-email-validator" class="external-link" target="_blank">`email-validator`</a>.
|
||||
Para usar `EmailStr`, primeiro instale [`email-validator`](https://github.com/JoshData/python-email-validator).
|
||||
|
||||
Certifique-se de criar um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ative-o e instale-o, por exemplo:
|
||||
Certifique-se de criar um [ambiente virtual](../virtual-environments.md), ative-o e então instale-o, por exemplo:
|
||||
|
||||
```console
|
||||
$ pip install email-validator
|
||||
@@ -181,7 +182,7 @@ Pode haver casos em que você retorna algo que não é um campo Pydantic válido
|
||||
|
||||
### Retorne uma Response diretamente { #return-a-response-directly }
|
||||
|
||||
O caso mais comum seria [retornar uma Response diretamente, conforme explicado posteriormente na documentação avançada](../advanced/response-directly.md){.internal-link target=_blank}.
|
||||
O caso mais comum seria [retornar uma Response diretamente, conforme explicado posteriormente na documentação avançada](../advanced/response-directly.md).
|
||||
|
||||
{* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *}
|
||||
|
||||
@@ -257,7 +258,7 @@ Você também pode usar:
|
||||
* `response_model_exclude_defaults=True`
|
||||
* `response_model_exclude_none=True`
|
||||
|
||||
conforme descrito na <a href="https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict" class="external-link" target="_blank">documentação do Pydantic</a> para `exclude_defaults` e `exclude_none`.
|
||||
conforme descrito na [documentação do Pydantic](https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict) para `exclude_defaults` e `exclude_none`.
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ O parâmetro `status_code` recebe um número com o código de status HTTP.
|
||||
|
||||
/// info | Informação
|
||||
|
||||
`status_code` também pode receber um `IntEnum`, como o do Python <a href="https://docs.python.org/3/library/http.html#http.HTTPStatus" class="external-link" target="_blank">`http.HTTPStatus`</a>.
|
||||
`status_code` também pode receber um `IntEnum`, como [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus) do Python.
|
||||
|
||||
///
|
||||
|
||||
@@ -66,7 +66,7 @@ Resumidamente:
|
||||
|
||||
/// tip | Dica
|
||||
|
||||
Para saber mais sobre cada código de status e qual código serve para quê, verifique a <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status" class="external-link" target="_blank">documentação do <abbr title="Mozilla Developer Network - Rede de Desenvolvedores da Mozilla">MDN</abbr> sobre códigos de status HTTP</a>.
|
||||
Para saber mais sobre cada código de status e qual código serve para quê, verifique a [documentação do <abbr title="Mozilla Developer Network - Rede de Desenvolvedores da Mozilla">MDN</abbr> sobre códigos de status HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status).
|
||||
|
||||
///
|
||||
|
||||
@@ -98,4 +98,4 @@ Você também pode usar `from starlette import status`.
|
||||
|
||||
## Alterando o padrão { #changing-the-default }
|
||||
|
||||
Mais tarde, no [Guia do Usuário Avançado](../advanced/response-change-status-code.md){.internal-link target=_blank}, você verá como retornar um código de status diferente do padrão que você está declarando aqui.
|
||||
Mais tarde, no [Guia do Usuário Avançado](../advanced/response-change-status-code.md), você verá como retornar um código de status diferente do padrão que você está declarando aqui.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Declarar dados de exemplo da requisição { #declare-request-example-data }
|
||||
# Declare dados de exemplo da requisição { #declare-request-example-data }
|
||||
|
||||
Você pode declarar exemplos dos dados que sua aplicação pode receber.
|
||||
|
||||
@@ -12,7 +12,7 @@ Você pode declarar `examples` para um modelo Pydantic que serão adicionados ao
|
||||
|
||||
Essas informações extras serão adicionadas como estão ao **JSON Schema** de saída para esse modelo e serão usadas na documentação da API.
|
||||
|
||||
Você pode usar o atributo `model_config`, que recebe um `dict`, conforme descrito na <a href="https://docs.pydantic.dev/latest/api/config/" class="external-link" target="_blank">documentação do Pydantic: Configuration</a>.
|
||||
Você pode usar o atributo `model_config`, que recebe um `dict`, conforme descrito na [documentação do Pydantic: Configuration](https://docs.pydantic.dev/latest/api/config/).
|
||||
|
||||
Você pode definir `"json_schema_extra"` com um `dict` contendo quaisquer dados adicionais que você queira que apareçam no JSON Schema gerado, incluindo `examples`.
|
||||
|
||||
@@ -145,12 +145,12 @@ O JSON Schema não tinha `examples`, então o OpenAPI adicionou seu próprio cam
|
||||
|
||||
O OpenAPI também adicionou os campos `example` e `examples` a outras partes da especificação:
|
||||
|
||||
* <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-object" class="external-link" target="_blank">`Parameter Object` (na especificação)</a>, usado no FastAPI por:
|
||||
* [`Parameter Object` (na especificação)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-object), usado no FastAPI por:
|
||||
* `Path()`
|
||||
* `Query()`
|
||||
* `Header()`
|
||||
* `Cookie()`
|
||||
* <a href="https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object" class="external-link" target="_blank">`Request Body Object`, no campo `content`, no `Media Type Object` (na especificação)</a>, usado no FastAPI por:
|
||||
* [`Request Body Object`, no campo `content`, no `Media Type Object` (na especificação)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object), usado no FastAPI por:
|
||||
* `Body()`
|
||||
* `File()`
|
||||
* `Form()`
|
||||
@@ -163,7 +163,7 @@ Esse parâmetro antigo `examples` específico do OpenAPI agora é `openapi_examp
|
||||
|
||||
### Campo `examples` do JSON Schema { #json-schemas-examples-field }
|
||||
|
||||
Depois, o JSON Schema adicionou um campo <a href="https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.5" class="external-link" target="_blank">`examples`</a> em uma nova versão da especificação.
|
||||
Depois, o JSON Schema adicionou um campo [`examples`](https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.5) em uma nova versão da especificação.
|
||||
|
||||
E então o novo OpenAPI 3.1.0 passou a se basear na versão mais recente (JSON Schema 2020-12), que incluiu esse novo campo `examples`.
|
||||
|
||||
|
||||
@@ -26,11 +26,11 @@ Copie o exemplo em um arquivo `main.py`:
|
||||
|
||||
/// info | Informação
|
||||
|
||||
O pacote <a href="https://github.com/Kludex/python-multipart" class="external-link" target="_blank">`python-multipart`</a> é instalado automaticamente com o **FastAPI** quando você executa o comando `pip install "fastapi[standard]"`.
|
||||
O pacote [`python-multipart`](https://github.com/Kludex/python-multipart) é instalado automaticamente com o **FastAPI** quando você executa o comando `pip install "fastapi[standard]"`.
|
||||
|
||||
Entretanto, se você usar o comando `pip install fastapi`, o pacote `python-multipart` não é incluído por padrão.
|
||||
|
||||
Para instalá-lo manualmente, certifique-se de criar um [ambiente virtual](../../virtual-environments.md){.internal-link target=_blank}, ativá-lo e então instalá-lo com:
|
||||
Para instalá-lo manualmente, certifique-se de criar um [ambiente virtual](../../virtual-environments.md), ativá-lo e então instalá-lo com:
|
||||
|
||||
```console
|
||||
$ pip install python-multipart
|
||||
@@ -45,7 +45,7 @@ Execute o exemplo com:
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ fastapi dev main.py
|
||||
$ fastapi dev
|
||||
|
||||
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
|
||||
```
|
||||
@@ -54,7 +54,7 @@ $ fastapi dev main.py
|
||||
|
||||
## Verifique-o { #check-it }
|
||||
|
||||
Vá até a documentação interativa em: <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>.
|
||||
Vá até a documentação interativa em: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
|
||||
|
||||
Você verá algo deste tipo:
|
||||
|
||||
@@ -140,7 +140,7 @@ Aqui `tokenUrl="token"` refere-se a uma URL relativa `token` que ainda não cria
|
||||
|
||||
Como estamos usando uma URL relativa, se sua API estivesse localizada em `https://example.com/`, então se referiria a `https://example.com/token`. Mas se sua API estivesse localizada em `https://example.com/api/v1/`, então se referiria a `https://example.com/api/v1/token`.
|
||||
|
||||
Usar uma URL relativa é importante para garantir que sua aplicação continue funcionando mesmo em um caso de uso avançado como [Atrás de um Proxy](../../advanced/behind-a-proxy.md){.internal-link target=_blank}.
|
||||
Usar uma URL relativa é importante para garantir que sua aplicação continue funcionando mesmo em um caso de uso avançado como [Atrás de um Proxy](../../advanced/behind-a-proxy.md).
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -24,13 +24,13 @@ Dessa forma, você pode criar um token com um prazo de expiração, digamos, de
|
||||
|
||||
Depois de uma semana, o token expirará e o usuário não estará autorizado, precisando fazer login novamente para obter um novo token. E se o usuário (ou uma terceira parte) tentar modificar o token para alterar a expiração, você seria capaz de descobrir isso, pois as assinaturas não iriam corresponder.
|
||||
|
||||
Se você quiser brincar com tokens JWT e ver como eles funcionam, visite <a href="https://jwt.io/" class="external-link" target="_blank">https://jwt.io</a>.
|
||||
Se você quiser brincar com tokens JWT e ver como eles funcionam, visite [https://jwt.io](https://jwt.io/).
|
||||
|
||||
## Instalar `PyJWT` { #install-pyjwt }
|
||||
|
||||
Nós precisamos instalar o `PyJWT` para criar e verificar os tokens JWT em Python.
|
||||
|
||||
Certifique-se de criar um [ambiente virtual](../../virtual-environments.md){.internal-link target=_blank}, ativá-lo e então instalar o `pyjwt`:
|
||||
Certifique-se de criar um [ambiente virtual](../../virtual-environments.md), ativá-lo e então instalar o `pyjwt`:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
@@ -46,7 +46,7 @@ $ pip install pyjwt
|
||||
|
||||
Se você pretente utilizar algoritmos de assinatura digital como o RSA ou o ECDSA, você deve instalar a dependência da biblioteca de criptografia `pyjwt[crypto]`.
|
||||
|
||||
Você pode ler mais sobre isso na <a href="https://pyjwt.readthedocs.io/en/latest/installation.html" class="external-link" target="_blank">documentação de instalação do PyJWT</a>.
|
||||
Você pode ler mais sobre isso na [documentação de instalação do PyJWT](https://pyjwt.readthedocs.io/en/latest/installation.html).
|
||||
|
||||
///
|
||||
|
||||
@@ -72,7 +72,7 @@ Ele suporta muitos algoritmos de hashing seguros e utilitários para trabalhar c
|
||||
|
||||
O algoritmo recomendado é o "Argon2".
|
||||
|
||||
Certifique-se de criar um [ambiente virtual](../../virtual-environments.md){.internal-link target=_blank}, ativá-lo e então instalar o pwdlib com Argon2:
|
||||
Certifique-se de criar um [ambiente virtual](../../virtual-environments.md), ativá-lo e então instalar o pwdlib com Argon2:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
@@ -200,7 +200,7 @@ O importante a se lembrar é que a chave `sub` deve ter um identificador único
|
||||
|
||||
## Verifique { #check-it }
|
||||
|
||||
Execute o servidor e vá para a documentação: <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>.
|
||||
Execute o servidor e vá para a documentação: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
|
||||
|
||||
Você verá a interface de usuário assim:
|
||||
|
||||
|
||||
@@ -144,9 +144,10 @@ UserInDB(
|
||||
)
|
||||
```
|
||||
|
||||
|
||||
/// info | Informação
|
||||
|
||||
Para uma explicação mais completa de `**user_dict`, verifique [a documentação para **Extra Models**](../extra-models.md#about-user-in-dict){.internal-link target=_blank}.
|
||||
Para uma explicação mais completa de `**user_dict`, verifique [a documentação para **Extra Models**](../extra-models.md#about-user-in-dict).
|
||||
|
||||
///
|
||||
|
||||
@@ -216,7 +217,7 @@ Esse é o benefício dos padrões...
|
||||
|
||||
## Veja em ação { #see-it-in-action }
|
||||
|
||||
Abra o docs interativo: <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>.
|
||||
Abra o docs interativo: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
|
||||
|
||||
### Autentique-se { #authenticate }
|
||||
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
|
||||
**FastAPI** não exige que você use um banco de dados SQL (relacional). Mas você pode usar **qualquer banco de dados** que quiser.
|
||||
|
||||
Aqui veremos um exemplo usando <a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">SQLModel</a>.
|
||||
Aqui veremos um exemplo usando [SQLModel](https://sqlmodel.tiangolo.com/).
|
||||
|
||||
**SQLModel** é construído sobre <a href="https://www.sqlalchemy.org/" class="external-link" target="_blank">SQLAlchemy</a> e Pydantic. Ele foi criado pelo mesmo autor do **FastAPI** para ser o par perfeito para aplicações **FastAPI** que precisam usar **bancos de dados SQL**.
|
||||
**SQLModel** é construído sobre [SQLAlchemy](https://www.sqlalchemy.org/) e Pydantic. Ele foi criado pelo mesmo autor do **FastAPI** para ser o par perfeito para aplicações **FastAPI** que precisam usar **bancos de dados SQL**.
|
||||
|
||||
/// tip | Dica
|
||||
|
||||
Você pode usar qualquer outra biblioteca de banco de dados SQL ou NoSQL que quiser (em alguns casos chamadas de <abbr title="Object Relational Mapper – Mapeador Objeto-Relacional: um termo sofisticado para uma biblioteca onde algumas classes representam tabelas SQL e instâncias representam linhas nessas tabelas">"ORMs"</abbr>), o FastAPI não obriga você a usar nada. 😎
|
||||
Você pode usar qualquer outra biblioteca de banco de dados SQL ou NoSQL que quiser (em alguns casos chamadas de <abbr title="Object Relational Mapper - Mapeador Objeto-Relacional: um termo sofisticado para uma biblioteca onde algumas classes representam tabelas SQL e instâncias representam linhas nessas tabelas">"ORMs"</abbr>), o FastAPI não obriga você a usar nada. 😎
|
||||
|
||||
///
|
||||
|
||||
@@ -26,15 +26,15 @@ Mais tarde, para sua aplicação em produção, você pode querer usar um servid
|
||||
|
||||
/// tip | Dica
|
||||
|
||||
Existe um gerador de projetos oficial com **FastAPI** e **PostgreSQL** incluindo um frontend e mais ferramentas: <a href="https://github.com/fastapi/full-stack-fastapi-template" class="external-link" target="_blank">https://github.com/fastapi/full-stack-fastapi-template</a>
|
||||
Existe um gerador de projetos oficial com **FastAPI** e **PostgreSQL** incluindo um frontend e mais ferramentas: [https://github.com/fastapi/full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template)
|
||||
|
||||
///
|
||||
|
||||
Este é um tutorial muito simples e curto, se você quiser aprender sobre bancos de dados em geral, sobre SQL ou recursos mais avançados, acesse a <a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">documentação do SQLModel</a>.
|
||||
Este é um tutorial muito simples e curto, se você quiser aprender sobre bancos de dados em geral, sobre SQL ou recursos mais avançados, acesse a [documentação do SQLModel](https://sqlmodel.tiangolo.com/).
|
||||
|
||||
## Instalar o `SQLModel` { #install-sqlmodel }
|
||||
|
||||
Primeiro, certifique-se de criar seu [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ativá-lo e, em seguida, instalar o `sqlmodel`:
|
||||
Primeiro, certifique-se de criar seu [ambiente virtual](../virtual-environments.md), ativá-lo e, em seguida, instalar o `sqlmodel`:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
@@ -45,7 +45,7 @@ $ pip install sqlmodel
|
||||
|
||||
</div>
|
||||
|
||||
## Criar o App com um Único Modelo { #create-the-app-with-a-single-model }
|
||||
## Crear o App com um Único Modelo { #create-the-app-with-a-single-model }
|
||||
|
||||
Vamos criar a primeira versão mais simples do app com um único modelo **SQLModel**.
|
||||
|
||||
@@ -65,7 +65,7 @@ Existem algumas diferenças:
|
||||
|
||||
* `Field(primary_key=True)` informa ao SQLModel que o `id` é a **chave primária** no banco de dados SQL (você pode aprender mais sobre chaves primárias SQL na documentação do SQLModel).
|
||||
|
||||
**Nota:** Usamos `int | None` para o campo de chave primária para que, no código Python, possamos *criar um objeto sem um `id`* (`id=None`), assumindo que o banco de dados irá *gerá-lo ao salvar*. O SQLModel entende que o banco de dados fornecerá o `id` e *define a coluna como um `INTEGER` não nulo* no esquema do banco de dados. Veja a <a href="https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id" class="external-link" target="_blank">documentação do SQLModel sobre chaves primárias</a> para detalhes.
|
||||
**Nota:** Usamos `int | None` para o campo de chave primária para que, no código Python, possamos *criar um objeto sem um `id`* (`id=None`), assumindo que o banco de dados irá *gerá-lo ao salvar*. O SQLModel entende que o banco de dados fornecerá o `id` e *define a coluna como um `INTEGER` não nulo* no esquema do banco de dados. Veja a [documentação do SQLModel sobre chaves primárias](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id) para detalhes.
|
||||
|
||||
* `Field(index=True)` informa ao SQLModel que ele deve criar um **índice SQL** para essa coluna, o que permitirá buscas mais rápidas no banco de dados ao ler dados filtrados por essa coluna.
|
||||
|
||||
@@ -96,7 +96,7 @@ Vamos criar uma **dependência** do FastAPI com `yield` que fornecerá uma nova
|
||||
|
||||
Então, criamos uma dependência `Annotated` chamada `SessionDep` para simplificar o restante do código que usará essa dependência.
|
||||
|
||||
{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[25:30] hl[25:27,30] *}
|
||||
{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[25:30] hl[25:27,30] *}
|
||||
|
||||
### Criar Tabelas de Banco de Dados na Inicialização { #create-database-tables-on-startup }
|
||||
|
||||
@@ -110,7 +110,7 @@ Para produção, você provavelmente usaria um script de migração que é execu
|
||||
|
||||
/// tip | Dica
|
||||
|
||||
O SQLModel terá utilitários de migração envolvendo o Alembic, mas por enquanto, você pode usar o <a href="https://alembic.sqlalchemy.org/en/latest/" class="external-link" target="_blank">Alembic</a> diretamente.
|
||||
O SQLModel terá utilitários de migração envolvendo o Alembic, mas por enquanto, você pode usar o [Alembic](https://alembic.sqlalchemy.org/en/latest/) diretamente.
|
||||
|
||||
///
|
||||
|
||||
@@ -151,7 +151,7 @@ Você pode executar o app:
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ fastapi dev main.py
|
||||
$ fastapi dev
|
||||
|
||||
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
|
||||
```
|
||||
@@ -168,7 +168,7 @@ Então, vá para a interface `/docs`, você verá que o **FastAPI** está usando
|
||||
|
||||
Agora vamos **refatorar** este app um pouco para aumentar a **segurança** e **versatilidade**.
|
||||
|
||||
Se você verificar o app anterior, na interface você pode ver que, até agora, ele permite que o cliente decida o `id` do `Hero` a ser criado. 😱
|
||||
Se você verificar o app anterior, na interface você pode ser que, até agora, ele permite que o cliente decida o `id` do `Hero` a ser criado. 😱
|
||||
|
||||
Não deveríamos deixar isso acontecer, eles poderiam sobrescrever um `id` que já atribuimos na base de dados. Decidir o `id` deve ser feito pelo **backend** ou pelo **banco de dados**, **não pelo cliente**.
|
||||
|
||||
@@ -336,7 +336,7 @@ Você pode executar o app novamente:
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ fastapi dev main.py
|
||||
$ fastapi dev
|
||||
|
||||
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
|
||||
```
|
||||
@@ -351,6 +351,6 @@ Se você for para a interface `/docs` da API, verá que agora ela está atualiza
|
||||
|
||||
## Recapitulando { #recap }
|
||||
|
||||
Você pode usar <a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">**SQLModel**</a> para interagir com um banco de dados SQL e simplificar o código com *modelos de dados* e *modelos de tabela*.
|
||||
Você pode usar [**SQLModel**](https://sqlmodel.tiangolo.com/) para interagir com um banco de dados SQL e simplificar o código com *modelos de dados* e *modelos de tabela*.
|
||||
|
||||
Você pode aprender muito mais na documentação do **SQLModel**, há um mini <a href="https://sqlmodel.tiangolo.com/tutorial/fastapi/" class="external-link" target="_blank">tutorial sobre como usar SQLModel com **FastAPI**</a> mais longo. 🚀
|
||||
Você pode aprender muito mais na documentação do **SQLModel**, há um mini [tutorial sobre como usar SQLModel com **FastAPI**](https://sqlmodel.tiangolo.com/tutorial/fastapi/) mais longo. 🚀
|
||||
|
||||
@@ -23,7 +23,7 @@ O **FastAPI** fornece o mesmo que `starlette.staticfiles` como `fastapi.staticfi
|
||||
|
||||
Isso é diferente de usar um `APIRouter`, pois uma aplicação montada é completamente independente. A OpenAPI e a documentação da sua aplicação principal não incluirão nada da aplicação montada, etc.
|
||||
|
||||
Você pode ler mais sobre isso no [Guia Avançado do Usuário](../advanced/index.md){.internal-link target=_blank}.
|
||||
Você pode ler mais sobre isso no [Guia Avançado do Usuário](../advanced/index.md).
|
||||
|
||||
## Detalhes { #details }
|
||||
|
||||
@@ -37,4 +37,4 @@ Todos esses parâmetros podem ser diferentes de "`static`", ajuste-os de acordo
|
||||
|
||||
## Mais informações { #more-info }
|
||||
|
||||
Para mais detalhes e opções, consulte <a href="https://www.starlette.dev/staticfiles/" class="external-link" target="_blank">a documentação da Starlette sobre Arquivos Estáticos</a>.
|
||||
Para mais detalhes e opções, consulte [a documentação da Starlette sobre Arquivos Estáticos](https://www.starlette.dev/staticfiles/).
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
# Testando { #testing }
|
||||
|
||||
Graças ao <a href="https://www.starlette.dev/testclient/" class="external-link" target="_blank">Starlette</a>, testar aplicações **FastAPI** é fácil e agradável.
|
||||
Graças ao [Starlette](https://www.starlette.dev/testclient/), testar aplicações **FastAPI** é fácil e agradável.
|
||||
|
||||
Ele é baseado no <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a>, que por sua vez é projetado com base em Requests, por isso é muito familiar e intuitivo.
|
||||
Ele é baseado no [HTTPX](https://www.python-httpx.org), que por sua vez é projetado com base em Requests, por isso é muito familiar e intuitivo.
|
||||
|
||||
Com ele, você pode usar o <a href="https://docs.pytest.org/" class="external-link" target="_blank">pytest</a> diretamente com **FastAPI**.
|
||||
Com ele, você pode usar o [pytest](https://docs.pytest.org/) diretamente com **FastAPI**.
|
||||
|
||||
## Usando `TestClient` { #using-testclient }
|
||||
|
||||
/// info | Informação
|
||||
|
||||
Para usar o `TestClient`, primeiro instale o <a href="https://www.python-httpx.org" class="external-link" target="_blank">`httpx`</a>.
|
||||
Para usar o `TestClient`, primeiro instale [`httpx`](https://www.python-httpx.org).
|
||||
|
||||
Certifique-se de criar um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ativá-lo e instalá-lo, por exemplo:
|
||||
Certifique-se de criar um [ambiente virtual](../virtual-environments.md), ativá-lo e instalá-lo, por exemplo:
|
||||
|
||||
```console
|
||||
$ pip install httpx
|
||||
@@ -52,7 +52,7 @@ Você também pode usar `from starlette.testclient import TestClient`.
|
||||
|
||||
/// tip | Dica
|
||||
|
||||
Se você quiser chamar funções `async` em seus testes além de enviar solicitações à sua aplicação FastAPI (por exemplo, funções de banco de dados assíncronas), dê uma olhada em [Testes assíncronos](../advanced/async-tests.md){.internal-link target=_blank} no tutorial avançado.
|
||||
Se você quiser chamar funções `async` em seus testes além de enviar solicitações à sua aplicação FastAPI (por exemplo, funções de banco de dados assíncronas), dê uma olhada em [Testes assíncronos](../advanced/async-tests.md) no tutorial avançado.
|
||||
|
||||
///
|
||||
|
||||
@@ -64,7 +64,7 @@ E sua aplicação **FastAPI** também pode ser composta de vários arquivos/mód
|
||||
|
||||
### Arquivo da aplicação **FastAPI** { #fastapi-app-file }
|
||||
|
||||
Digamos que você tenha uma estrutura de arquivo conforme descrito em [Aplicações maiores](bigger-applications.md){.internal-link target=_blank}:
|
||||
Digamos que você tenha uma estrutura de arquivo conforme descrito em [Aplicações maiores](bigger-applications.md):
|
||||
|
||||
```
|
||||
.
|
||||
@@ -140,13 +140,13 @@ Por exemplo:
|
||||
* Para passar *headers*, use um `dict` no parâmetro `headers`.
|
||||
* Para *cookies*, um `dict` no parâmetro `cookies`.
|
||||
|
||||
Para mais informações sobre como passar dados para o backend (usando `httpx` ou `TestClient`), consulte a <a href="https://www.python-httpx.org" class="external-link" target="_blank">documentação do HTTPX</a>.
|
||||
Para mais informações sobre como passar dados para o backend (usando `httpx` ou `TestClient`), consulte a [documentação do HTTPX](https://www.python-httpx.org).
|
||||
|
||||
/// info | Informação
|
||||
|
||||
Observe que o `TestClient` recebe dados que podem ser convertidos para JSON, não para modelos Pydantic.
|
||||
|
||||
Se você tiver um modelo Pydantic em seu teste e quiser enviar seus dados para o aplicativo durante o teste, poderá usar o `jsonable_encoder` descrito em [Codificador compatível com JSON](encoder.md){.internal-link target=_blank}.
|
||||
Se você tiver um modelo Pydantic em seu teste e quiser enviar seus dados para o aplicativo durante o teste, poderá usar o `jsonable_encoder` descrito em [Codificador compatível com JSON](encoder.md).
|
||||
|
||||
///
|
||||
|
||||
@@ -154,7 +154,7 @@ Se você tiver um modelo Pydantic em seu teste e quiser enviar seus dados para o
|
||||
|
||||
Depois disso, você só precisa instalar o `pytest`.
|
||||
|
||||
Certifique-se de criar um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ativá-lo e instalá-lo, por exemplo:
|
||||
Certifique-se de criar um [ambiente virtual](../virtual-environments.md), ativá-lo e instalá-lo, por exemplo:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
|
||||
Reference in New Issue
Block a user