Skip to content

Commit b12c14c

Browse files
🌐 Update translations for pt (add-missing)
1 parent fa63a15 commit b12c14c

6 files changed

Lines changed: 522 additions & 0 deletions

File tree

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# JSON com bytes em Base64 { #json-with-bytes-as-base64 }
2+
3+
Se sua aplicação precisa receber e enviar dados JSON, mas você precisa incluir dados binários nele, você pode codificá-los em base64.
4+
5+
## Base64 vs Arquivos { #base64-vs-files }
6+
7+
Primeiro, considere se você pode usar [Arquivos na request](../tutorial/request-files.md) para fazer upload de dados binários e [Response personalizada - FileResponse](./custom-response.md#fileresponse--fileresponse-) para enviar dados binários, em vez de codificá-los em JSON.
8+
9+
JSON só pode conter strings codificadas em UTF-8, portanto não pode conter bytes puros.
10+
11+
Base64 pode codificar dados binários em strings, mas, para isso, precisa usar mais caracteres do que os dados binários originais; assim, normalmente é menos eficiente do que arquivos comuns.
12+
13+
Use base64 apenas se realmente precisar incluir dados binários em JSON e não puder usar arquivos para isso.
14+
15+
## Pydantic `bytes` { #pydantic-bytes }
16+
17+
Você pode declarar um modelo Pydantic com campos `bytes` e então usar `val_json_bytes` na configuração do modelo para indicar que deve usar base64 para *validar* os dados JSON de entrada; como parte dessa validação, ele decodificará a string base64 em bytes.
18+
19+
{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *}
20+
21+
Se você verificar a `/docs`, verá que o campo `data` espera bytes codificados em base64:
22+
23+
<div class="screenshot">
24+
<img src="/img/tutorial/json-base64-bytes/image01.png">
25+
</div>
26+
27+
Você poderia enviar uma request assim:
28+
29+
```json
30+
{
31+
"description": "Some data",
32+
"data": "aGVsbG8="
33+
}
34+
```
35+
36+
/// tip | Dica
37+
38+
`aGVsbG8=` é a codificação base64 de `hello`.
39+
40+
///
41+
42+
Em seguida, o Pydantic decodificará a string base64 e fornecerá os bytes originais no campo `data` do modelo.
43+
44+
Você receberá uma response assim:
45+
46+
```json
47+
{
48+
"description": "Some data",
49+
"content": "hello"
50+
}
51+
```
52+
53+
## Pydantic `bytes` para dados de saída { #pydantic-bytes-for-output-data }
54+
55+
Você também pode usar campos `bytes` com `ser_json_bytes` na configuração do modelo para dados de saída, e o Pydantic irá *serializar* os bytes como base64 ao gerar a response JSON.
56+
57+
{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *}
58+
59+
## Pydantic `bytes` para dados de entrada e saída { #pydantic-bytes-for-input-and-output-data }
60+
61+
E, claro, você pode usar o mesmo modelo configurado para usar base64 para lidar tanto com a entrada (*validar*) com `val_json_bytes` quanto com a saída (*serializar*) com `ser_json_bytes` ao receber e enviar dados JSON.
62+
63+
{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
# Transmitir dados { #stream-data }
2+
3+
Se você quer transmitir dados que podem ser estruturados como JSON, você deveria [Transmitir JSON Lines](../tutorial/stream-json-lines.md).
4+
5+
Mas se você quer transmitir dados binários puros ou strings, veja como fazer.
6+
7+
/// info | Informação
8+
9+
Adicionado no FastAPI 0.134.0.
10+
11+
///
12+
13+
## Casos de uso { #use-cases }
14+
15+
Você pode usar isto para transmitir strings puras, por exemplo diretamente da saída de um serviço de AI LLM.
16+
17+
Você também pode usá-lo para transmitir arquivos binários grandes, enviando cada bloco de dados à medida que o lê, sem precisar carregar tudo na memória de uma vez.
18+
19+
Você também pode transmitir vídeo ou áudio desta forma; pode até ser gerado enquanto você processa e envia.
20+
21+
## Um `StreamingResponse` com `yield` { #a-streamingresponse-with-yield }
22+
23+
Se você declarar `response_class=StreamingResponse` na sua função de operação de rota, você pode usar `yield` para enviar cada bloco de dados em sequência.
24+
25+
{* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *}
26+
27+
O FastAPI entregará cada bloco de dados para `StreamingResponse` como está, não tentará convertê-lo para JSON nem nada semelhante.
28+
29+
### Funções de operação de rota não assíncronas { #non-async-path-operation-functions }
30+
31+
Você também pode usar funções `def` normais (sem `async`) e usar `yield` da mesma forma.
32+
33+
{* ../../docs_src/stream_data/tutorial001_py310.py ln[26:29] hl[27] *}
34+
35+
### Sem anotação { #no-annotation }
36+
37+
Você não precisa declarar a anotação de tipo de retorno para transmitir dados binários.
38+
39+
Como o FastAPI não tentará converter os dados para JSON com Pydantic nem serializá-los de nenhuma forma, neste caso a anotação de tipo serve apenas para seu editor e ferramentas; ela não será usada pelo FastAPI.
40+
41+
{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *}
42+
43+
Isso também significa que, com `StreamingResponse`, você tem a liberdade e a responsabilidade de produzir e codificar os bytes exatamente como precisam ser enviados, independentemente das anotações de tipo. 🤓
44+
45+
### Transmitir bytes { #stream-bytes }
46+
47+
Um dos principais casos de uso é transmitir `bytes` em vez de strings; você pode fazer isso sem problemas.
48+
49+
{* ../../docs_src/stream_data/tutorial001_py310.py ln[44:47] hl[47] *}
50+
51+
## Um `PNGStreamingResponse` personalizado { #a-custom-pngstreamingresponse }
52+
53+
Nos exemplos acima, os bytes eram transmitidos, mas a resposta não tinha um cabeçalho `Content-Type`, então o cliente não sabia que tipo de dado estava recebendo.
54+
55+
Você pode criar uma subclasse personalizada de `StreamingResponse` que define o cabeçalho `Content-Type` para o tipo de dado que você está transmitindo.
56+
57+
Por exemplo, você pode criar um `PNGStreamingResponse` que define o cabeçalho `Content-Type` como `image/png` usando o atributo `media_type`:
58+
59+
{* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *}
60+
61+
Em seguida, você pode usar essa nova classe em `response_class=PNGStreamingResponse` na sua função de operação de rota:
62+
63+
{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *}
64+
65+
### Simular um arquivo { #simulate-a-file }
66+
67+
Neste exemplo, estamos simulando um arquivo com `io.BytesIO`, que é um objeto semelhante a arquivo que vive somente na memória, mas nos permite usar a mesma interface.
68+
69+
Por exemplo, podemos iterar sobre ele para consumir seu conteúdo, como faríamos com um arquivo.
70+
71+
{* ../../docs_src/stream_data/tutorial002_py310.py ln[1:27] hl[3,12:13,25] *}
72+
73+
/// note | Detalhes Técnicos
74+
75+
As outras duas variáveis, `image_base64` e `binary_image`, são uma imagem codificada em Base64 e depois convertida para bytes, para então passá-la para `io.BytesIO`.
76+
77+
Apenas para que possa viver no mesmo arquivo deste exemplo e você possa copiar e executar como está. 🥚
78+
79+
///
80+
81+
Ao usar um bloco `with`, garantimos que o objeto semelhante a arquivo seja fechado após a função geradora (a função com `yield`) terminar. Ou seja, após terminar de enviar a resposta.
82+
83+
Isso não seria tão importante neste exemplo específico porque é um arquivo falso em memória (com `io.BytesIO`), mas com um arquivo real, seria importante garantir que o arquivo fosse fechado ao final do trabalho.
84+
85+
### Arquivos e async { #files-and-async }
86+
87+
Na maioria dos casos, objetos semelhantes a arquivo não são compatíveis com async e await por padrão.
88+
89+
Por exemplo, eles não têm `await file.read()`, nem `async for chunk in file`.
90+
91+
E, em muitos casos, lê-los seria uma operação bloqueante (que poderia bloquear o loop de eventos), pois são lidos do disco ou da rede.
92+
93+
/// info | Informação
94+
95+
O exemplo acima é, na verdade, uma exceção, porque o objeto `io.BytesIO` já está em memória, então lê-lo não bloqueará nada.
96+
97+
Mas, em muitos casos, ler um arquivo ou um objeto semelhante a arquivo bloquearia.
98+
99+
///
100+
101+
Para evitar bloquear o loop de eventos, você pode simplesmente declarar a função de operação de rota com `def` normal em vez de `async def`. Assim, o FastAPI a executará em um worker de threadpool, evitando bloquear o loop principal.
102+
103+
{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *}
104+
105+
/// tip | Dica
106+
107+
Se você precisar chamar código bloqueante de dentro de uma função assíncrona ou uma função assíncrona de dentro de uma função bloqueante, você poderia usar o [Asyncer](https://asyncer.tiangolo.com), uma biblioteca irmã do FastAPI.
108+
109+
///
110+
111+
### `yield from` { #yield-from }
112+
113+
Quando você está iterando sobre algo, como um objeto semelhante a arquivo, e faz `yield` para cada item, você também pode usar `yield from` para produzir cada item diretamente e pular o loop `for`.
114+
115+
Isso não é particular do FastAPI, é apenas Python, mas é um truque útil para conhecer. 😎
116+
117+
{* ../../docs_src/stream_data/tutorial002_py310.py ln[37:40] hl[40] *}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# Verificação Estrita de Content-Type { #strict-content-type-checking }
2+
3+
Por padrão, o **FastAPI** usa verificação estrita do cabeçalho `Content-Type` para corpos de requisição JSON; isso significa que requisições JSON devem incluir um `Content-Type` válido (por exemplo, `application/json`) para que o corpo seja interpretado como JSON.
4+
5+
## Risco de CSRF { #csrf-risk }
6+
7+
Esse comportamento padrão oferece proteção contra uma classe de ataques de **Cross-Site Request Forgery (CSRF)** em um cenário muito específico.
8+
9+
Esses ataques exploram o fato de que navegadores permitem que scripts enviem requisições sem fazer qualquer verificação de preflight de CORS quando:
10+
11+
- não têm um cabeçalho `Content-Type` (por exemplo, usando `fetch()` com um corpo `Blob`)
12+
- e não enviam nenhuma credencial de autenticação.
13+
14+
Esse tipo de ataque é relevante principalmente quando:
15+
16+
- a aplicação está em execução localmente (por exemplo, em `localhost`) ou em uma rede interna
17+
- e a aplicação não tem autenticação, pressupondo que qualquer requisição da mesma rede é confiável.
18+
19+
## Exemplo de Ataque { #example-attack }
20+
21+
Imagine que você desenvolve uma forma de executar um agente de IA local.
22+
23+
Ele fornece uma API em
24+
25+
```
26+
http://localhost:8000/v1/agents/multivac
27+
```
28+
29+
Há também um frontend em
30+
31+
```
32+
http://localhost:8000
33+
```
34+
35+
/// tip | Dica
36+
37+
Observe que ambos têm o mesmo host.
38+
39+
///
40+
41+
Usando o frontend, você pode fazer o agente de IA executar ações em seu nome.
42+
43+
Como está em execução localmente e não na Internet aberta, você decide não configurar autenticação, confiando apenas no acesso à rede local.
44+
45+
Então um de seus usuários poderia instalá-lo e executá-lo localmente.
46+
47+
Em seguida, poderia abrir um site malicioso, por exemplo:
48+
49+
```
50+
https://evilhackers.example.com
51+
```
52+
53+
E esse site malicioso envia requisições usando `fetch()` com um corpo `Blob` para a API local em
54+
55+
```
56+
http://localhost:8000/v1/agents/multivac
57+
```
58+
59+
Mesmo que o host do site malicioso e o da aplicação local sejam diferentes, o navegador não acionará uma requisição preflight de CORS porque:
60+
61+
- Está em execução sem autenticação, não precisa enviar credenciais.
62+
- O navegador acha que não está enviando JSON (devido à falta do cabeçalho `Content-Type`).
63+
64+
Então o site malicioso poderia fazer o agente de IA local enviar mensagens raivosas ao ex-chefe do usuário... ou pior. 😅
65+
66+
## Internet Aberta { #open-internet }
67+
68+
Se sua aplicação está na Internet aberta, você não “confiaria na rede” nem deixaria qualquer pessoa enviar requisições privilegiadas sem autenticação.
69+
70+
Atacantes poderiam simplesmente executar um script para enviar requisições à sua API, sem necessidade de interação do navegador, então você provavelmente já está protegendo quaisquer endpoints privilegiados.
71+
72+
Nesse caso, esse ataque/risco não se aplica a você.
73+
74+
Esse risco e ataque é relevante principalmente quando a aplicação roda na rede local e essa é a única proteção presumida.
75+
76+
## Permitindo Requisições sem Content-Type { #allowing-requests-without-content-type }
77+
78+
Se você precisa dar suporte a clientes que não enviam um cabeçalho `Content-Type`, você pode desativar a verificação estrita definindo `strict_content_type=False`:
79+
80+
{* ../../docs_src/strict_content_type/tutorial001_py310.py hl[4] *}
81+
82+
Com essa configuração, requisições sem um cabeçalho `Content-Type` terão o corpo interpretado como JSON, o mesmo comportamento das versões mais antigas do FastAPI.
83+
84+
/// info | Informação
85+
86+
Esse comportamento e configuração foram adicionados no FastAPI 0.132.0.
87+
88+
///

docs/pt/docs/editor-support.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Suporte a Editores { #editor-support }
2+
3+
A [FastAPI Extension](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) oficial melhora seu fluxo de trabalho de desenvolvimento com descoberta e navegação de *operação de rota*, além de implantação no FastAPI Cloud e transmissão ao vivo de logs.
4+
5+
Para mais detalhes sobre a extensão, consulte o README no [repositório do GitHub](https://github.com/fastapi/fastapi-vscode).
6+
7+
## Configuração e Instalação { #setup-and-installation }
8+
9+
A **FastAPI Extension** está disponível para [VS Code](https://code.visualstudio.com/) e [Cursor](https://www.cursor.com/). Pode ser instalada diretamente pelo painel de Extensões de cada editor, pesquisando por "FastAPI" e selecionando a extensão publicada por **FastAPI Labs**. A extensão também funciona em editores no navegador, como [vscode.dev](https://vscode.dev) e [github.dev](https://github.dev).
10+
11+
### Descoberta da Aplicação { #application-discovery }
12+
13+
Por padrão, a extensão descobre automaticamente aplicações FastAPI no seu workspace procurando por arquivos que instanciam `FastAPI()`. Se a detecção automática não funcionar para a estrutura do seu projeto, você pode especificar um ponto de entrada via `[tool.fastapi]` em `pyproject.toml` ou pela configuração `fastapi.entryPoint` do VS Code usando notação de módulo (por exemplo, `myapp.main:app`).
14+
15+
## Funcionalidades { #features }
16+
17+
- **Explorador de Operações de Rota** - Uma visualização em árvore na barra lateral de todas as <dfn title="rotas, endpoints">*operações de rota*</dfn> da sua aplicação. Clique para ir diretamente a qualquer definição de rota ou de router.
18+
- **Pesquisa de Rotas** - Pesquise por path, método ou nome com <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>E</kbd> (no macOS: <kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>E</kbd>).
19+
- **Navegação com CodeLens** - Links clicáveis acima das chamadas do cliente de testes (por exemplo, `client.get('/items')`) que levam à *operação de rota* correspondente, facilitando a navegação entre testes e implementação.
20+
- **Implantar no FastAPI Cloud** - Implantação com um clique da sua aplicação no [FastAPI Cloud](https://fastapicloud.com/).
21+
- **Transmitir logs da aplicação** - Transmissão em tempo real dos logs da aplicação implantada no FastAPI Cloud, com filtragem por nível e busca de texto.
22+
23+
Se quiser se familiarizar com as funcionalidades da extensão, você pode abrir o walkthrough da extensão acessando a Paleta de Comandos (<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd> ou no macOS: <kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>), selecionando "Welcome: Open walkthrough..." e, em seguida, escolhendo o walkthrough "Get started with FastAPI".

0 commit comments

Comments
 (0)