]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
🌐 Update translations for pt (update-outdated) (#15893)
authorSebastiĂĄn RamĂ­rez <tiangolo@gmail.com>
Wed, 1 Jul 2026 13:45:25 +0000 (15:45 +0200)
committerGitHub <noreply@github.com>
Wed, 1 Jul 2026 13:45:25 +0000 (15:45 +0200)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Yurii Motov <yurii.motov.monte@gmail.com>
60 files changed:
docs/pt/docs/_llm-test.md
docs/pt/docs/advanced/additional-status-codes.md
docs/pt/docs/advanced/advanced-dependencies.md
docs/pt/docs/advanced/dataclasses.md
docs/pt/docs/advanced/events.md
docs/pt/docs/advanced/generate-clients.md
docs/pt/docs/advanced/json-base64-bytes.md
docs/pt/docs/advanced/openapi-callbacks.md
docs/pt/docs/advanced/response-change-status-code.md
docs/pt/docs/advanced/response-cookies.md
docs/pt/docs/advanced/response-headers.md
docs/pt/docs/advanced/security/oauth2-scopes.md
docs/pt/docs/advanced/settings.md
docs/pt/docs/advanced/stream-data.md
docs/pt/docs/advanced/wsgi.md
docs/pt/docs/alternatives.md
docs/pt/docs/async.md
docs/pt/docs/deployment/cloud.md
docs/pt/docs/deployment/concepts.md
docs/pt/docs/deployment/docker.md
docs/pt/docs/deployment/https.md
docs/pt/docs/deployment/manually.md
docs/pt/docs/editor-support.md
docs/pt/docs/environment-variables.md
docs/pt/docs/features.md
docs/pt/docs/help-fastapi.md
docs/pt/docs/how-to/configure-swagger-ui.md
docs/pt/docs/how-to/custom-request-and-route.md
docs/pt/docs/how-to/graphql.md
docs/pt/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
docs/pt/docs/how-to/separate-openapi-schemas.md
docs/pt/docs/index.md
docs/pt/docs/project-generation.md
docs/pt/docs/python-types.md
docs/pt/docs/tutorial/bigger-applications.md
docs/pt/docs/tutorial/body-nested-models.md
docs/pt/docs/tutorial/body.md
docs/pt/docs/tutorial/debugging.md
docs/pt/docs/tutorial/dependencies/dependencies-with-yield.md
docs/pt/docs/tutorial/extra-data-types.md
docs/pt/docs/tutorial/extra-models.md
docs/pt/docs/tutorial/first-steps.md
docs/pt/docs/tutorial/handling-errors.md
docs/pt/docs/tutorial/index.md
docs/pt/docs/tutorial/metadata.md
docs/pt/docs/tutorial/path-operation-configuration.md
docs/pt/docs/tutorial/query-params-str-validations.md
docs/pt/docs/tutorial/query-params.md
docs/pt/docs/tutorial/request-files.md
docs/pt/docs/tutorial/request-forms.md
docs/pt/docs/tutorial/response-status-code.md
docs/pt/docs/tutorial/schema-extra-example.md
docs/pt/docs/tutorial/security/first-steps.md
docs/pt/docs/tutorial/security/get-current-user.md
docs/pt/docs/tutorial/security/oauth2-jwt.md
docs/pt/docs/tutorial/security/simple-oauth2.md
docs/pt/docs/tutorial/sql-databases.md
docs/pt/docs/tutorial/static-files.md
docs/pt/docs/tutorial/testing.md
docs/pt/docs/virtual-environments.md

index 714c121b4e4a33db8ce24e83082a4dd352122231..2e20e5b58d2cb6262661f1ad5772fce049ea9b6c 100644 (file)
@@ -11,7 +11,7 @@ Use da seguinte forma:
 * Verifique se estĂĄ tudo certo na tradução.
 * Se necessĂĄrio, melhore seu prompt especĂ­fico do idioma, o prompt geral ou o documento em inglĂȘs.
 * Em seguida, corrija manualmente os problemas restantes na tradução, para que fique uma boa tradução.
-* Retraduzir, tendo a boa tradução no lugar. O resultado ideal seria que o LLM nĂŁo fizesse mais mudanças na tradução. Isso significa que o prompt geral e o seu prompt especĂ­fico do idioma estĂŁo tĂŁo bons quanto possĂ­vel (Ă s vezes farĂĄ algumas mudanças aparentemente aleatĂłrias, a razĂŁo Ă© que [LLMs nĂŁo sĂŁo algoritmos determinĂ­sticos](https://doublespeak.chat/#/handbook#deterministic-output)).
+* Retraduza, tendo a boa tradução no lugar. O resultado ideal seria que o LLM nĂŁo fizesse mais mudanças na tradução. Isso significa que o prompt geral e o seu prompt especĂ­fico do idioma estĂŁo tĂŁo bons quanto possĂ­vel (Ă s vezes farĂĄ algumas mudanças aparentemente aleatĂłrias, a razĂŁo Ă© que [LLMs nĂŁo sĂŁo algoritmos determinĂ­sticos](https://doublespeak.chat/#/handbook#deterministic-output)).
 
 Os testes:
 
@@ -189,15 +189,15 @@ Aqui estĂŁo algumas coisas envolvidas em elementos HTML "abbr" (algumas sĂŁo inv
 
 ### O abbr fornece uma frase completa { #the-abbr-gives-a-full-phrase }
 
-* <abbr title="Getting Things Done â€“ Fazer as Coisas">GTD</abbr>
-* <abbr title="less than â€“ menos que"><code>lt</code></abbr>
-* <abbr title="XML Web Token â€“ Token Web XML">XWT</abbr>
-* <abbr title="Parallel Server Gateway Interface â€“ Interface de Gateway de Servidor Paralelo">PSGI</abbr>
+* <abbr title="Getting Things Done - Fazer as Coisas">GTD</abbr>
+* <abbr title="less than - menos que"><code>lt</code></abbr>
+* <abbr title="XML Web Token - Token Web XML">XWT</abbr>
+* <abbr title="Parallel Server Gateway Interface - Interface de Gateway de Servidor Paralelo">PSGI</abbr>
 
 ### O abbr fornece uma frase completa e uma explicação { #the-abbr-gives-a-full-phrase-and-an-explanation }
 
-* <abbr title="Mozilla Developer Network â€“ Rede de Desenvolvedores da Mozilla: documentação para desenvolvedores, escrita pelo pessoal do Firefox">MDN</abbr>
-* <abbr title="Input/Output â€“ Entrada/SaĂ­da: leitura ou escrita em disco, comunicaçÔes de rede.">I/O</abbr>.
+* <abbr title="Mozilla Developer Network - Rede de Desenvolvedores da Mozilla: documentação para desenvolvedores, escrita pelo pessoal do Firefox">MDN</abbr>
+* <abbr title="Input/Output: leitura ou escrita em disco, comunicaçÔes de rede.">I/O</abbr>.
 
 ////
 
index af1cefaf2b6bad2561eb8e8e96694727038794ce..b702b8b41388ca0d4a0735da8333f4b1806127ab 100644 (file)
@@ -30,12 +30,12 @@ Garanta que ele tenha toda informação que vocĂȘ deseja, e que os valores sejam
 
 VocĂȘ tambĂ©m pode utilizar `from starlette.responses import JSONResponse`.
 
-O **FastAPI** disponibiliza o `starlette.responses` como `fastapi.responses` apenas por conveniĂȘncia para vocĂȘ, o programador. PorĂ©m a maioria dos retornos disponĂ­veis vem diretamente do Starlette. O mesmo com `status`.
+O **FastAPI** disponibiliza o `starlette.responses` como `fastapi.responses` apenas por conveniĂȘncia para vocĂȘ, o programador. PorĂ©m a maioria das respostas disponĂ­veis vem diretamente do Starlette. O mesmo com `status`.
 
 ///
 
 ## OpenAPI e documentação da API { #openapi-and-api-docs }
 
-Se vocĂȘ retorna cĂłdigos de status adicionais e retornos diretamente, eles nĂŁo serĂŁo incluĂ­dos no esquema do OpenAPI (a documentação da API), porque o FastAPI nĂŁo tem como saber de antemĂŁo o que serĂĄ retornado.
+Se vocĂȘ retorna cĂłdigos de status adicionais e respostas diretamente, eles nĂŁo serĂŁo incluĂ­dos no esquema do OpenAPI (a documentação da API), porque o FastAPI nĂŁo tem como saber de antemĂŁo o que serĂĄ retornado.
 
-Mas vocĂȘ pode documentar isso no seu cĂłdigo, utilizando: [Retornos Adicionais](additional-responses.md).
+Mas vocĂȘ pode documentar isso no seu cĂłdigo, utilizando: [Respostas Adicionais](additional-responses.md).
index 15a78afec8380a663f22e1e374f01f8907e1616b..21c1490ff622c14f05c0dafdec042532d75e27d5 100644 (file)
@@ -1,5 +1,6 @@
 # DependĂȘncias avançadas { #advanced-dependencies }
 
+
 ## DependĂȘncias parametrizadas { #parameterized-dependencies }
 
 Todas as dependĂȘncias que vimos atĂ© agora sĂŁo funçÔes ou classes fixas.
index 7956196c71ba0eff6935918bf7e5caa22e557369..f1cc5a070f9225180d3ab203f392dd48eff988e4 100644 (file)
@@ -8,7 +8,7 @@ Mas o FastAPI tambĂ©m suporta o uso de [`dataclasses`](https://docs.python.org/3
 
 Isso ainda Ă© suportado graças ao **Pydantic**, pois ele tem [suporte interno para `dataclasses`](https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel).
 
-EntĂŁo, mesmo com o cĂłdigo acima que nĂŁo usa Pydantic explicitamente, o FastAPI estĂĄ usando Pydantic para converter essas dataclasses padrĂŁo para a versĂŁo do Pydantic.
+EntĂŁo, mesmo com o cĂłdigo acima que nĂŁo usa Pydantic explicitamente, o FastAPI estĂĄ usando Pydantic para converter essas dataclasses padrĂŁo para a prĂłpria versĂŁo de dataclasses do Pydantic.
 
 E claro, ele suporta o mesmo:
 
index a6262d8dab578489c916608af2fe1eff9e1c36bd..eee4dc8805f6a31169591463048e7a8c282f9da9 100644 (file)
@@ -1,5 +1,6 @@
 # Eventos de lifespan { #lifespan-events }
 
+
 VocĂȘ pode definir a lĂłgica (cĂłdigo) que deve ser executada antes da aplicação **inicializar**. Isso significa que esse cĂłdigo serĂĄ executado **uma vez**, **antes** de a aplicação **começar a receber requisiçÔes**.
 
 Da mesma forma, vocĂȘ pode definir a lĂłgica (cĂłdigo) que deve ser executada quando a aplicação estiver **encerrando**. Nesse caso, esse cĂłdigo serĂĄ executado **uma vez**, **depois** de possivelmente ter tratado **vĂĄrias requisiçÔes**.
index 89f2a89f4914b5386a5286706023b1121f530589..975fb902d14b3637b8acf3731f537a3b0f42abb2 100644 (file)
@@ -20,27 +20,13 @@ O FastAPI gera automaticamente especificaçÔes **OpenAPI 3.1**, entĂŁo qualquer
 
 ///
 
-## Geradores de SDK dos patrocinadores do FastAPI { #sdk-generators-from-fastapi-sponsors }
-
-Esta seção destaca soluçÔes **financiadas por investimento** e **com suporte de empresas** que patrocinam o FastAPI. Esses produtos fornecem **funcionalidades adicionais** e **integraçÔes** alĂ©m de SDKs gerados com alta qualidade.
-
-Ao âœš [**patrocinar o FastAPI**](../help-fastapi.md#sponsor-the-author) âœš, essas empresas ajudam a garantir que o framework e seu **ecossistema** continuem saudĂĄveis e **sustentĂĄveis**.
-
-O patrocĂ­nio tambĂ©m demonstra um forte compromisso com a **comunidade** FastAPI (vocĂȘ), mostrando que elas se importam nĂŁo apenas em oferecer um **Ăłtimo serviço**, mas tambĂ©m em apoiar um **framework robusto e prĂłspero**, o FastAPI. đŸ™‡
-
-Por exemplo, vocĂȘ pode querer experimentar:
-
-* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
-
-Algumas dessas soluçÔes tambĂ©m podem ser open source ou oferecer planos gratuitos, para que vocĂȘ possa testĂĄ-las sem compromisso financeiro. Outros geradores comerciais de SDK estĂŁo disponĂ­veis e podem ser encontrados online. đŸ€“
-
 ## Crie um SDK em TypeScript { #create-a-typescript-sdk }
 
 Vamos começar com uma aplicação FastAPI simples:
 
 {* ../../docs_src/generate_clients/tutorial001_py310.py hl[7:9,12:13,16:17,21] *}
 
-Observe que as *operaçÔes de rota* definem os modelos que usam para o corpo da requisição e o corpo da resposta, usando os modelos `Item` e `ResponseMessage`.
+Observe que as *operaçÔes de rota* definem os modelos que usam para o payload da requisição e o payload da resposta, usando os modelos `Item` e `ResponseMessage`.
 
 ### Documentação da API { #api-docs }
 
@@ -72,7 +58,7 @@ Agora vocĂȘ pode importar e usar o cĂłdigo do cliente. Poderia ser assim, observ
 
 <img src="/img/tutorial/generate-clients/image02.png">
 
-VocĂȘ tambĂ©m obterĂĄ preenchimento automĂĄtico para o corpo a ser enviado:
+VocĂȘ tambĂ©m obterĂĄ preenchimento automĂĄtico para o payload a enviar:
 
 <img src="/img/tutorial/generate-clients/image03.png">
 
@@ -121,7 +107,7 @@ ItemsService.createItemItemsPost({name: "Plumbus", price: 5})
 
 ...isso ocorre porque o gerador de clientes usa o **ID de operação interno do OpenAPI** para cada *operação de rota*.
 
-O OpenAPI exige que cada ID de operação seja Ășnico em todas as *operaçÔes de rota*, entĂŁo o FastAPI usa o **nome da função**, o **path** e o **mĂ©todo HTTP** para gerar esse ID de operação, porque dessa forma ele pode garantir que os IDs de operação sejam Ășnicos.
+O OpenAPI exige que cada ID de operação seja Ășnico em todas as *operaçÔes de rota*, entĂŁo o FastAPI usa o **nome da função**, o **path** e o **mĂ©todo/operação HTTP** para gerar esse ID de operação, porque dessa forma ele pode garantir que os IDs de operação sejam Ășnicos.
 
 Mas eu vou te mostrar como melhorar isso a seguir. đŸ€“
 
@@ -194,8 +180,8 @@ Depois de gerar o novo cliente, vocĂȘ terĂĄ agora **nomes de mĂ©todos â€œlimpos
 Ao usar os clientes gerados automaticamente, vocĂȘ terĂĄ **preenchimento automĂĄtico** para:
 
 * MĂ©todos.
-* Corpos de requisiçÔes, parĂąmetros de query, etc.
-* Corpos de respostas.
+* Payloads de requisiçÔes no body, parĂąmetros de query, etc.
+* Payloads de respostas.
 
 VocĂȘ tambĂ©m terĂĄ **erros em linha** para tudo.
 
index cc956da4f03b938f11e1c196ab4fae5a06002b57..8034430ab27b665e54e98ba63c5ad8cf9d3ea167 100644 (file)
@@ -4,7 +4,7 @@ Se sua aplicação precisa receber e enviar dados JSON, mas vocĂȘ precisa inclui
 
 ## Base64 vs Arquivos { #base64-vs-files }
 
-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.
+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) para enviar dados binĂĄrios, em vez de codificĂĄ-los em JSON.
 
 JSON sĂł pode conter strings codificadas em UTF-8, portanto nĂŁo pode conter bytes puros.
 
index 1403425a9ca201e250a5478ab628e6b0217f350c..08877e4f7c13c29ba9c19fab74bde3e87beb5856 100644 (file)
@@ -1,16 +1,16 @@
 # Callbacks na OpenAPI { #openapi-callbacks }
 
-VocĂȘ poderia criar uma API com uma *operação de rota* que poderia acionar um request a uma *API externa* criada por outra pessoa (provavelmente o mesmo desenvolvedor que estaria *usando* sua API).
+VocĂȘ poderia criar uma API com uma *operação de rota* que poderia acionar um request para uma *API externa* criada por outra pessoa (provavelmente o mesmo desenvolvedor que estaria *usando* sua API).
 
 O processo que acontece quando sua aplicação de API chama a *API externa* Ă© chamado de "callback". Porque o software que o desenvolvedor externo escreveu envia um request para sua API e entĂŁo sua API *chama de volta*, enviando um request para uma *API externa* (que provavelmente foi criada pelo mesmo desenvolvedor).
 
 Nesse caso, vocĂȘ poderia querer documentar como essa API externa *deveria* ser. Que *operação de rota* ela deveria ter, que corpo ela deveria esperar, que resposta ela deveria retornar, etc.
 
-## Um aplicativo com callbacks { #an-app-with-callbacks }
+## Uma aplicação com callbacks { #an-app-with-callbacks }
 
 Vamos ver tudo isso com um exemplo.
 
-Imagine que vocĂȘ desenvolve um aplicativo que permite criar faturas.
+Imagine que vocĂȘ desenvolve uma aplicação que permite criar faturas.
 
 Essas faturas terĂŁo um `id`, `title` (opcional), `customer` e `total`.
 
@@ -23,11 +23,11 @@ EntĂŁo sua API irĂĄ (vamos imaginar):
 * Enviar a notificação de volta para o usuĂĄrio da API (o desenvolvedor externo).
     * Isso serĂĄ feito enviando um request POST (de *sua API*) para alguma *API externa* fornecida por esse desenvolvedor externo (este Ă© o "callback").
 
-## O aplicativo **FastAPI** normal { #the-normal-fastapi-app }
+## A aplicação **FastAPI** normal { #the-normal-fastapi-app }
 
-Vamos primeiro ver como o aplicativo da API normal se pareceria antes de adicionar o callback.
+Vamos primeiro ver como a aplicação da API normal se pareceria antes de adicionar o callback.
 
-Ele terĂĄ uma *operação de rota* que receberĂĄ um corpo `Invoice`, e um parĂąmetro de consulta `callback_url` que conterĂĄ a URL para o callback.
+Ela terĂĄ uma *operação de rota* que receberĂĄ um corpo `Invoice`, e um parĂąmetro de consulta `callback_url` que conterĂĄ a URL para o callback.
 
 Essa parte Ă© bastante normal, a maior parte do cĂłdigo provavelmente jĂĄ Ă© familiar para vocĂȘ:
 
@@ -45,7 +45,7 @@ A Ășnica novidade Ă© o `callbacks=invoices_callback_router.routes` como argument
 
 O cĂłdigo real do callback dependerĂĄ muito da sua prĂłpria aplicação de API.
 
-E provavelmente variarĂĄ muito de um aplicativo para o outro.
+E provavelmente variarĂĄ muito de uma aplicação para outra.
 
 Poderia ser apenas uma ou duas linhas de cĂłdigo, como:
 
@@ -72,7 +72,7 @@ Ao implementar o callback por conta prĂłpria, vocĂȘ pode usar algo como [HTTPX](
 
 ## Escreva o cĂłdigo de documentação do callback { #write-the-callback-documentation-code }
 
-Esse cĂłdigo nĂŁo serĂĄ executado em seu aplicativo, nĂłs sĂł precisamos dele para *documentar* como essa *API externa* deveria ser.
+Esse cĂłdigo nĂŁo serĂĄ executado em sua aplicação, nĂłs sĂł precisamos dele para *documentar* como essa *API externa* deveria ser.
 
 Mas, vocĂȘ jĂĄ sabe como criar facilmente documentação automĂĄtica para uma API com o **FastAPI**.
 
@@ -105,7 +105,7 @@ Ela deve parecer exatamente como uma *operação de rota* normal do FastAPI:
 
 HĂĄ 2 diferenças principais de uma *operação de rota* normal:
 
-* Ela nĂŁo necessita ter nenhum cĂłdigo real, porque seu aplicativo nunca chamarĂĄ esse cĂłdigo. Ele Ă© usado apenas para documentar a *API externa*. EntĂŁo, a função poderia ter apenas `pass`.
+* Ela nĂŁo necessita ter nenhum cĂłdigo real, porque sua aplicação nunca chamarĂĄ esse cĂłdigo. Ele Ă© usado apenas para documentar a *API externa*. EntĂŁo, a função poderia ter apenas `pass`.
 * O *path* pode conter uma [expressĂŁo OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) (veja mais abaixo) em que pode usar variĂĄveis com parĂąmetros e partes do request original enviado para *sua API*.
 
 ### A expressĂŁo do path do callback { #the-callback-path-expression }
@@ -163,23 +163,23 @@ Perceba como a URL de callback usada contĂ©m a URL recebida como um parĂąmetro d
 
 ///
 
-### Adicione o roteador de callback { #add-the-callback-router }
+### Adicione o router de callback { #add-the-callback-router }
 
-Nesse ponto vocĂȘ tem a(s) *operação(Ă”es) de rota de callback* necessĂĄria(s) (a(s) que o *desenvolvedor externo* deveria implementar na *API externa*) no roteador de callback que vocĂȘ criou acima.
+Nesse ponto vocĂȘ tem a(s) *operação(Ă”es) de rota de callback* necessĂĄria(s) (a(s) que o *desenvolvedor externo* deveria implementar na *API externa*) no router de callback que vocĂȘ criou acima.
 
-Agora use o parĂąmetro `callbacks` no decorador da *operação de rota da sua API* para passar o atributo `.routes` do roteador de callback:
+Agora use o parĂąmetro `callbacks` no decorador da *operação de rota da sua API* para passar o atributo `.routes` desse router de callback:
 
 {* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *}
 
 /// tip | Dica
 
-Perceba que vocĂȘ nĂŁo estĂĄ passando o roteador em si (`invoices_callback_router`) para `callbacks=`, mas o atributo `.routes`, como em `invoices_callback_router.routes`. O FastAPI usarĂĄ essas rotas para gerar a documentação OpenAPI do callback.
+Perceba que vocĂȘ nĂŁo estĂĄ passando o router em si (`invoices_callback_router`) para `callbacks=`, mas seu `.routes`, como em `invoices_callback_router.routes`. FastAPI usarĂĄ essas rotas para gerar a documentação OpenAPI do callback.
 
 ///
 
 ### Verifique a documentação { #check-the-docs }
 
-Agora vocĂȘ pode iniciar seu aplicativo e ir para [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
+Agora vocĂȘ pode iniciar sua aplicação e ir para [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
 
 VocĂȘ verĂĄ sua documentação incluindo uma seção "Callbacks" para sua *operação de rota* que mostra como a *API externa* deveria ser:
 
index 44ca6062a54a292529e4978896b5f4ae4f225a9b..1e902338bdbfea955c9332105f181f7bce392297 100644 (file)
@@ -18,7 +18,7 @@ Para estes casos, vocĂȘ pode utilizar um parĂąmetro `Response`.
 
 VocĂȘ pode declarar um parĂąmetro do tipo `Response` em sua *função de operação de rota* (assim como vocĂȘ pode fazer para cookies e headers).
 
-E entĂŁo vocĂȘ pode definir o `status_code` neste objeto de retorno *temporal*.
+E entĂŁo vocĂȘ pode definir o `status_code` neste objeto de retorno *temporĂĄrio*.
 
 {* ../../docs_src/response_change_status_code/tutorial001_py310.py hl[1,9,12] *}
 
@@ -26,6 +26,6 @@ E entĂŁo vocĂȘ pode retornar qualquer objeto que vocĂȘ precise, como vocĂȘ faria
 
 E se vocĂȘ declarar um `response_model`, ele ainda serĂĄ utilizado para filtrar e converter o objeto que vocĂȘ retornou.
 
-O **FastAPI** utilizarĂĄ este retorno *temporal* para extrair o cĂłdigo de status (e tambĂ©m cookies e headers), e irĂĄ colocĂĄ-los no retorno final que contĂ©m o valor que vocĂȘ retornou, filtrado por qualquer `response_model`.
+O **FastAPI** utilizarĂĄ este retorno *temporĂĄrio* para extrair o cĂłdigo de status (e tambĂ©m cookies e headers), e irĂĄ colocĂĄ-los no retorno final que contĂ©m o valor que vocĂȘ retornou, filtrado por qualquer `response_model`.
 
 VocĂȘ tambĂ©m pode declarar o parĂąmetro `Response` nas dependĂȘncias, e definir o cĂłdigo de status nelas. Mas lembre-se que o Ășltimo que for definido Ă© o que prevalecerĂĄ.
index 691bd1b9c5c57df648217babe1ab781f815e3c68..e775027503511efb0e8167d30af913bcf45a5c38 100644 (file)
@@ -30,7 +30,7 @@ EntĂŁo, defina os cookies nela e a retorne:
 
 Lembre-se de que se vocĂȘ retornar uma resposta diretamente em vez de usar o parĂąmetro `Response`, FastAPI a retornarĂĄ diretamente.
 
-Portanto, vocĂȘ terĂĄ que garantir que seus dados sejam do tipo correto. E.g. serĂĄ compatĂ­vel com JSON se vocĂȘ estiver retornando um `JSONResponse`.
+Portanto, vocĂȘ terĂĄ que garantir que seus dados sejam do tipo correto. Por exemplo, serĂĄ compatĂ­vel com JSON se vocĂȘ estiver retornando um `JSONResponse`.
 
 E tambĂ©m que vocĂȘ nĂŁo esteja enviando nenhum dado que deveria ter sido filtrado por um `response_model`.
 
index 7235b5eb8cabfda5dceb0ac72d1d8da5d5e22e43..08a1b6708b76f0606d16566f37953aa6905689a5 100644 (file)
@@ -1,5 +1,6 @@
 # Cabeçalhos de resposta { #response-headers }
 
+
 ## Use um parĂąmetro `Response` { #use-a-response-parameter }
 
 VocĂȘ pode declarar um parĂąmetro do tipo `Response` na sua *função de operação de rota* (assim como vocĂȘ pode fazer para cookies).
index 9dfa6aaf681367c91681ba593cdf1989a098ed0b..b0b9e83485c79777c2d93f0c6ce14881158ee73d 100644 (file)
@@ -2,9 +2,9 @@
 
 VocĂȘ pode utilizar escopos do OAuth2 diretamente com o **FastAPI**, eles sĂŁo integrados para funcionar perfeitamente.
 
-Isso permitiria que vocĂȘ tivesse um sistema de permissionamento mais refinado, seguindo o padrĂŁo do OAuth2 integrado na sua aplicação OpenAPI (e as documentaçÔes da API).
+Isso permitiria que vocĂȘ tivesse um sistema de permissionamento mais refinado, seguindo o padrĂŁo OAuth2, integrado na sua aplicação OpenAPI (e a documentação da API).
 
-OAuth2 com escopos Ă© o mecanismo utilizado por muitos provedores de autenticação, como o Facebook, Google, GitHub, Microsoft, X (Twitter), etc. Eles utilizam isso para prover permissĂ”es especĂ­ficas para os usuĂĄrios e aplicaçÔes.
+OAuth2 com escopos Ă© o mecanismo utilizado por muitos grandes provedores de autenticação, como o Facebook, Google, GitHub, Microsoft, X (Twitter), etc. Eles utilizam isso para prover permissĂ”es especĂ­ficas para os usuĂĄrios e aplicaçÔes.
 
 Toda vez que vocĂȘ "se autentica com" Facebook, Google, GitHub, Microsoft, X (Twitter), aquela aplicação estĂĄ utilizando o OAuth2 com escopos.
 
@@ -34,7 +34,7 @@ O conteĂșdo de cada uma dessas strings pode ter qualquer formato, mas nĂŁo devem
 
 Estes escopos representam "permissĂ”es".
 
-No OpenAPI (e.g. os documentos da API), vocĂȘ pode definir "esquemas de segurança".
+No OpenAPI (por exemplo, a documentação da API), vocĂȘ pode definir "esquemas de segurança".
 
 Quando um desses esquemas de segurança utiliza OAuth2, vocĂȘ pode tambĂ©m declarar e utilizar escopos.
 
@@ -42,7 +42,7 @@ Cada "escopo" Ă© apenas uma string (sem espaços).
 
 Eles sĂŁo normalmente utilizados para declarar permissĂ”es de segurança especĂ­ficas, como por exemplo:
 
-* `users:read` or `users:write` sĂŁo exemplos comuns.
+* `users:read` ou `users:write` sĂŁo exemplos comuns.
 * `instagram_basic` Ă© utilizado pelo Facebook / Instagram.
 * `https://www.googleapis.com/auth/drive` Ă© utilizado pelo Google.
 
@@ -60,7 +60,7 @@ Para o OAuth2, eles sĂŁo apenas strings.
 
 ## VisĂŁo global { #global-view }
 
-Primeiro, vamos olhar rapidamente as partes que mudam dos exemplos do **Tutorial - Guia de UsuĂĄrio** para [OAuth2 com Senha (e hash), Bearer com tokens JWT](../../tutorial/security/oauth2-jwt.md). Agora utilizando escopos OAuth2:
+Primeiro, vamos olhar rapidamente as partes que mudam dos exemplos no **Tutorial - Guia de UsuĂĄrio** principal para [OAuth2 com Senha (e hash), Bearer com tokens JWT](../../tutorial/security/oauth2-jwt.md). Agora utilizando escopos OAuth2:
 
 {* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *}
 
@@ -74,7 +74,7 @@ O parĂąmetro `scopes` recebe um `dict` contendo cada escopo como chave e a descr
 
 {* ../../docs_src/security/tutorial005_an_py310.py hl[63:66] *}
 
-Pelo motivo de estarmos declarando estes escopos, eles aparecerĂŁo nos documentos da API quando vocĂȘ se autenticar/autorizar.
+Pelo motivo de estarmos declarando estes escopos, eles aparecerĂŁo na documentação da API quando vocĂȘ se autenticar/autorizar.
 
 E vocĂȘ poderĂĄ selecionar quais escopos vocĂȘ deseja dar acesso: `me` e `items`.
 
@@ -108,7 +108,7 @@ Para isso, nĂłs importamos e utilizamos `Security` de `fastapi`.
 
 VocĂȘ pode utilizar `Security` para declarar dependĂȘncias (assim como `Depends`), porĂ©m o `Security` tambĂ©m recebe o parĂąmetro `scopes` com uma lista de escopos (strings).
 
-Neste caso, nĂłs passamos a função `get_current_active_user` como dependĂȘncia para `Security` (da mesma forma que nĂłs farĂ­amos com `Depends`).
+Neste caso, nĂłs passamos a função de dependĂȘncia `get_current_active_user` para `Security` (da mesma forma que nĂłs farĂ­amos com `Depends`).
 
 Mas nĂłs tambĂ©m passamos uma `list` de escopos, neste caso com apenas um escopo: `items` (poderia ter mais).
 
@@ -142,7 +142,7 @@ Agora atualize a dependĂȘncia `get_current_user`.
 
 Este Ă© o usado pelas dependĂȘncias acima.
 
-Aqui Ă© onde estamos utilizando o mesmo esquema OAuth2 que nĂłs declaramos antes, declarando-o como uma dependĂȘncia: `oauth2_scheme`.
+Aqui Ă© onde estamos utilizando o mesmo esquema OAuth2 que nĂłs criamos antes, declarando-o como uma dependĂȘncia: `oauth2_scheme`.
 
 Porque esta função de dependĂȘncia nĂŁo possui nenhum requerimento de escopo, nĂłs podemos utilizar `Depends` com o `oauth2_scheme`. NĂłs nĂŁo precisamos utilizar `Security` quando nĂłs nĂŁo precisamos especificar escopos de segurança.
 
@@ -235,7 +235,7 @@ Todos eles serĂŁo validados independentemente para cada *operação de rota*.
 
 ## Verifique { #check-it }
 
-Se vocĂȘ abrir os documentos da API, vocĂȘ pode autenticar e especificar quais escopos vocĂȘ quer autorizar.
+Se vocĂȘ abrir a documentação da API, vocĂȘ pode autenticar e especificar quais escopos vocĂȘ quer autorizar.
 
 <img src="/img/tutorial/security/image11.png">
 
@@ -249,11 +249,11 @@ Isso Ă© o que aconteceria se uma aplicação terceira que tentou acessar uma des
 
 Neste exemplo nĂłs estamos utilizando o fluxo de senha do OAuth2.
 
-Isso Ă© apropriado quando nĂłs estamos autenticando em nossa prĂłpria aplicação, provavelmente com o nosso prĂłprio "*frontend*".
+Isso Ă© apropriado quando nĂłs estamos autenticando em nossa prĂłpria aplicação, provavelmente com o nosso prĂłprio frontend.
 
 Porque nĂłs podemos confiar nele para receber o `username` e o `password`, pois nĂłs controlamos isso.
 
-Mas se nĂłs estamos construindo uma aplicação OAuth2 que outros poderiam conectar (i.e., se vocĂȘ estĂĄ construindo um provedor de autenticação equivalente ao Facebook, Google, GitHub, etc.) vocĂȘ deveria utilizar um dos outros fluxos.
+Mas se nĂłs estamos construindo uma aplicação OAuth2 que outros poderiam conectar (ou seja, se vocĂȘ estĂĄ construindo um provedor de autenticação equivalente ao Facebook, Google, GitHub, etc.) vocĂȘ deveria utilizar um dos outros fluxos.
 
 O mais comum Ă© o fluxo implĂ­cito.
 
index 371d5711bdfcb980f535aa45c38e368f105cbdf8..029290aed51d8e7197e6dd1a4967912efb76b43b 100644 (file)
@@ -1,5 +1,6 @@
 # ConfiguraçÔes e VariĂĄveis de Ambiente { #settings-and-environment-variables }
 
+
 Em muitos casos, sua aplicação pode precisar de configuraçÔes externas, por exemplo chaves secretas, credenciais de banco de dados, credenciais para serviços de e-mail, etc.
 
 A maioria dessas configuraçÔes Ă© variĂĄvel (pode mudar), como URLs de banco de dados. E muitas podem ser sensĂ­veis, como segredos.
index c71d2ca422d2885afc3996d584f7d1950dbda706..1a9284a91d50084824e1109791e869f590118068 100644 (file)
@@ -2,7 +2,7 @@
 
 Se vocĂȘ quer transmitir dados que podem ser estruturados como JSON, vocĂȘ deveria [Transmitir JSON Lines](../tutorial/stream-json-lines.md).
 
-Mas se vocĂȘ quer transmitir dados binĂĄrios puros ou strings, veja como fazer.
+Mas se vocĂȘ quer **transmitir dados binĂĄrios puros** ou strings, veja como fazer.
 
 /// note | Nota
 
@@ -12,15 +12,15 @@ Adicionado no FastAPI 0.134.0.
 
 ## Casos de uso { #use-cases }
 
-VocĂȘ pode usar isto para transmitir strings puras, por exemplo diretamente da saĂ­da de um serviço de AI LLM.
+VocĂȘ pode usar isto para transmitir strings puras, por exemplo diretamente da saĂ­da de um serviço de **AI LLM**.
 
-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.
+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.
 
-VocĂȘ tambĂ©m pode transmitir vĂ­deo ou ĂĄudio desta forma; pode atĂ© ser gerado enquanto vocĂȘ processa e envia.
+VocĂȘ tambĂ©m pode transmitir **vĂ­deo** ou **ĂĄudio** desta forma; pode atĂ© ser gerado enquanto vocĂȘ processa e envia.
 
 ## Um `StreamingResponse` com `yield` { #a-streamingresponse-with-yield }
 
-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.
+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.
 
 {* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *}
 
@@ -40,7 +40,7 @@ Como o FastAPI nĂŁo tentarĂĄ converter os dados para JSON com Pydantic nem seria
 
 {* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *}
 
-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. đŸ€“
+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. đŸ€“
 
 ### Transmitir bytes { #stream-bytes }
 
@@ -50,7 +50,7 @@ Um dos principais casos de uso Ă© transmitir `bytes` em vez de strings; vocĂȘ po
 
 ## Um `PNGStreamingResponse` personalizado { #a-custom-pngstreamingresponse }
 
-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.
+Nos exemplos acima, os bytes eram transmitidos, mas a response nĂŁo tinha um cabeçalho `Content-Type`, entĂŁo o cliente nĂŁo sabia que tipo de dado estava recebendo.
 
 VocĂȘ pode criar uma subclasse personalizada de `StreamingResponse` que define o cabeçalho `Content-Type` para o tipo de dado que vocĂȘ estĂĄ transmitindo.
 
@@ -58,7 +58,7 @@ Por exemplo, vocĂȘ pode criar um `PNGStreamingResponse` que define o cabeçalho
 
 {* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *}
 
-Em seguida, vocĂȘ pode usar essa nova classe em `response_class=PNGStreamingResponse` na sua função de operação de rota:
+Em seguida, vocĂȘ pode usar essa nova classe em `response_class=PNGStreamingResponse` na sua *função de operação de rota*:
 
 {* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *}
 
@@ -78,7 +78,7 @@ Apenas para que possa viver no mesmo arquivo deste exemplo e vocĂȘ possa copiar
 
 ///
 
-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.
+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 response.
 
 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.
 
@@ -98,7 +98,7 @@ Mas, em muitos casos, ler um arquivo ou um objeto semelhante a arquivo bloqueari
 
 ///
 
-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.
+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.
 
 {* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *}
 
index 30e8a3b2c7ac615fe7d674428039c27f53517640..fafa147fab623341c4a05ff150539bfde169527a 100644 (file)
@@ -1,5 +1,6 @@
 # Adicionando WSGI - Flask, Django, entre outros { #including-wsgi-flask-django-others }
 
+
 Como vocĂȘ viu em [SubaplicaçÔes - Montagens](sub-applications.md) e [AtrĂĄs de um Proxy](behind-a-proxy.md), vocĂȘ pode montar aplicaçÔes WSGI.
 
 Para isso, vocĂȘ pode utilizar o `WSGIMiddleware` para encapsular a sua aplicação WSGI, como por exemplo Flask, Django, etc.
index b32b260c38fb462cbe63bd3615c78bf04d0e3fd1..8a63a30733ffe0a7bc4f8e31a3a91bad27afeea7 100644 (file)
@@ -18,13 +18,13 @@ Mas em algum momento, nĂŁo havia outra opção senĂŁo criar algo que fornecesse
 
 Ă‰ o framework Python mais popular e amplamente confiĂĄvel. Ă‰ utilizado para construir sistemas como o Instagram.
 
-É relativamente bem acoplado com bancos de dados relacionais (como MySQL ou PostgreSQL), entĂŁo, ter um banco de dados NoSQL (como Couchbase, MongoDB, Cassandra, etc.) como mecanismo principal de armazenamento nĂŁo Ă© muito fĂĄcil.
+É relativamente fortemente acoplado com bancos de dados relacionais (como MySQL ou PostgreSQL), entĂŁo, ter um banco de dados NoSQL (como Couchbase, MongoDB, Cassandra, etc.) como mecanismo principal de armazenamento nĂŁo Ă© muito fĂĄcil.
 
 Foi criado para gerar o HTML no backend, nĂŁo para criar APIs usadas por um frontend moderno (como React, Vue.js e Angular) ou por outros sistemas (como dispositivos <abbr title="Internet of Things - Internet das Coisas">IoT</abbr>) comunicando com ele.
 
 ### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework }
 
-Django REST framework foi criado para ser uma caixa de ferramentas flexĂ­vel para construção de APIs Web utilizando Django por baixo, para melhorar suas capacidades de API.
+Django REST Framework foi criado para ser uma caixa de ferramentas flexĂ­vel para construção de APIs Web utilizando Django por baixo, para melhorar suas capacidades de API.
 
 Ele Ă© utilizado por muitas empresas incluindo Mozilla, Red Hat e Eventbrite.
 
@@ -88,7 +88,7 @@ O jeito de usar Ă© muito simples. Por exemplo, para fazer uma requisição `GET`
 response = requests.get("http://example.com/some/url")
 ```
 
-A contra-parte na aplicação FastAPI, a operação de rota, poderia ficar assim:
+A *operação de rota* da API equivalente no FastAPI poderia ficar assim:
 
 ```Python hl_lines="1"
 @app.get("/some/url")
@@ -377,7 +377,7 @@ Agora APIStar Ă© um conjunto de ferramentas para validar especificaçÔes OpenAP
 
 /// note | Nota
 
-APIStar foi criado por Tom Christie. O mesmo cara que criou:
+APIStar foi criado por Tom Christie. A mesma pessoa que criou:
 
 * Django REST Framework
 * Starlette (no qual **FastAPI** Ă© baseado)
index 8c497d4513fc52472d38e4599755afe3f02df51b..3fa92b085c255db7798679fcdb8226899139b1ff 100644 (file)
@@ -44,11 +44,11 @@ Se sua aplicação (de alguma forma) nĂŁo tem que se comunicar com nada mais e e
 
 ---
 
-Se vocĂȘ simplesmente nĂŁo sabe, use apenas `def`.
+Se vocĂȘ simplesmente nĂŁo sabe, use `def` normal.
 
 ---
 
-**Note**: VocĂȘ pode misturar `def` e `async def` nas suas *funçÔes de operação de rota* tanto quanto necessĂĄrio e definir cada função usando a melhor opção para vocĂȘ. FastAPI irĂĄ fazer a coisa certa com elas.
+**Nota**: VocĂȘ pode misturar `def` e `async def` nas suas *funçÔes de operação de rota* tanto quanto necessĂĄrio e definir cada função usando a melhor opção para vocĂȘ. FastAPI irĂĄ fazer a coisa certa com elas.
 
 De qualquer forma, em ambos os casos acima, FastAPI irĂĄ trabalhar assincronamente e ser extremamente rĂĄpido.
 
@@ -82,10 +82,10 @@ Esse "esperar por algo" normalmente se refere a operaçÔes <abbr title="Input a
 * conteĂșdo que seu programa deu ao sistema para ser escrito no disco
 * uma operação em uma API remota
 * uma operação no banco de dados finalizar
-* uma solicitação no banco de dados retornar o resultado
+* uma consulta ao banco de dados retornar os resultados
 * etc.
 
-Quanto o tempo de execução Ă© consumido majoritariamente pela espera de operaçÔes <abbr title="Input and Output - Entrada e SaĂ­da">I/O</abbr>, essas operaçÔes sĂŁo chamadas operaçÔes "limitadas por I/O".
+Como o tempo de execução Ă© consumido majoritariamente pela espera de operaçÔes <abbr title="Input and Output - Entrada e SaĂ­da">I/O</abbr>, essas operaçÔes sĂŁo chamadas operaçÔes "limitadas por I/O".
 
 Isso Ă© chamado de "assĂ­ncrono" porque o computador / programa nĂŁo tem que ser "sincronizado" com a tarefa lenta, esperando pelo momento exato em que a tarefa finaliza, enquanto nĂŁo faz nada, para ser capaz de pegar o resultado da tarefa e dar continuidade ao trabalho.
 
@@ -109,7 +109,7 @@ VocĂȘ vai com seu _crush_ na lanchonete, e fica na fila enquanto o caixa pega os
 
 <img src="/img/async/concurrent-burgers/concurrent-burgers-01.png" class="illustration">
 
-EntĂŁo chega a sua vez, vocĂȘ pede dois saborosos hambĂșrgueres para vocĂȘ e seu _crush_.  đŸ”đŸ”
+EntĂŁo chega a sua vez, vocĂȘ pede dois saborosos hambĂșrgueres para vocĂȘ e seu _crush_. đŸ”đŸ”
 
 <img src="/img/async/concurrent-burgers/concurrent-burgers-02.png" class="illustration">
 
@@ -189,17 +189,17 @@ VocĂȘ espera, na frente do balcĂŁo đŸ•™, para que ninguĂ©m pegue seus hambĂșrgue
 
 Como vocĂȘ e seu _crush_ estĂŁo ocupados nĂŁo permitindo que ninguĂ©m passe na frente e pegue seus hambĂșrgueres assim que estiverem prontos, vocĂȘ nĂŁo pode dar atenção ao seu _crush_. đŸ˜ž
 
-Isso Ă© trabalho "sĂ­ncrono", vocĂȘ estĂĄ "sincronizado" com o caixa / cozinheiro đŸ‘šâ€đŸł. VocĂȘ tem que esperar đŸ•™ e estar lĂĄ no exato momento que o caixa / cozinheiro đŸ‘šâ€đŸł terminar os hambĂșrgueres e os der a vocĂȘ, ou entĂŁo, outro alguĂ©m pode pegĂĄ-los.
+Isso Ă© trabalho "sĂ­ncrono", vocĂȘ estĂĄ "sincronizado" com o caixa/cozinheiro đŸ‘šâ€đŸł. VocĂȘ tem que esperar đŸ•™ e estar lĂĄ no exato momento que o caixa/cozinheiro đŸ‘šâ€đŸł terminar os hambĂșrgueres e os der a vocĂȘ, ou entĂŁo, outro alguĂ©m pode pegĂĄ-los.
 
 <img src="/img/async/parallel-burgers/parallel-burgers-04.png" class="illustration">
 
-EntĂŁo seu caixa / cozinheiro đŸ‘šâ€đŸł finalmente volta com seus hambĂșrgueres, depois de um longo tempo esperando đŸ•™ por eles em frente ao balcĂŁo.
+EntĂŁo seu caixa/cozinheiro đŸ‘šâ€đŸł finalmente volta com seus hambĂșrgueres, depois de um longo tempo esperando đŸ•™ por eles em frente ao balcĂŁo.
 
 <img src="/img/async/parallel-burgers/parallel-burgers-05.png" class="illustration">
 
 VocĂȘ pega seus hambĂșrgueres e vai para a mesa com seu _crush_.
 
-VocĂȘs comem os hambĂșrgueres, e o trabalho estĂĄ terminado. âč
+VocĂȘs apenas os comem, e o trabalho estĂĄ terminado. âč
 
 <img src="/img/async/parallel-burgers/parallel-burgers-06.png" class="illustration">
 
@@ -213,15 +213,15 @@ Belas ilustraçÔes de [Ketrina Thompson](https://www.instagram.com/ketrinadraws
 
 ---
 
-Nesse cenĂĄrio dos hambĂșrgueres paralelos, vocĂȘ Ă© um computador / programa đŸ€– com dois processadores (vocĂȘ e seu _crush_), ambos esperando đŸ•™ e dedicando sua atenção âŻ "esperando no balcĂŁo" đŸ•™ por um bom tempo.
+Nesse cenĂĄrio dos hambĂșrgueres paralelos, vocĂȘ Ă© um computador / programa đŸ€– com dois processadores (vocĂȘ e seu _crush_), ambos esperando đŸ•™ e dedicando sua atenção âŻ a "esperar no balcĂŁo" đŸ•™ por um bom tempo.
 
-A lanchonete paralela tem 8 processadores (caixas / cozinheiros), enquanto a lanchonete dos hambĂșrgueres concorrentes tinha apenas 2 (um caixa e um cozinheiro).
+A lanchonete tem 8 processadores (caixas/cozinheiros). Enquanto a lanchonete dos hambĂșrgueres concorrentes poderia ter apenas 2 (um caixa e um cozinheiro).
 
 Ainda assim, a experiĂȘncia final nĂŁo foi a melhor. đŸ˜ž
 
 ---
 
-Essa seria o equivalente paralelo Ă  histĂłria dos hambĂșrgueres. đŸ”
+Essa seria a histĂłria equivalente paralela para hambĂșrgueres. đŸ”
 
 Para um exemplo "mais real", imagine um banco.
 
@@ -231,15 +231,15 @@ Todos os caixas fazendo todo o trabalho, um cliente apĂłs o outro đŸ‘šâ€đŸ’ŒâŻ
 
 E vocĂȘ tinha que esperar đŸ•™ na fila por um longo tempo ou poderia perder a vez.
 
-VocĂȘ provavelmente nĂŁo gostaria de levar seu _crush_ đŸ˜ com vocĂȘ para um rolezinho no banco đŸŠ.
+VocĂȘ provavelmente nĂŁo gostaria de levar seu _crush_ đŸ˜ com vocĂȘ para resolver assuntos no banco đŸŠ.
 
 ### ConclusĂŁo dos hambĂșrgueres { #burger-conclusion }
 
-Nesse cenĂĄrio dos "hambĂșrgueres com seu _crush_", como tem muita espera, faz mais sentido ter um sistema concorrente âžđŸ”€âŻ.
+Nesse cenĂĄrio dos "hambĂșrgueres de fast food com seu _crush_", como tem muita espera đŸ•™, faz mais sentido ter um sistema concorrente âžđŸ”€âŻ.
 
 Esse Ă© o caso da maioria das aplicaçÔes web.
 
-Muitos, muitos usuĂĄrios, mas seu servidor estĂĄ esperando đŸ•™ pela sua conexĂŁo nĂŁo tĂŁo boa enviar suas requisiçÔes.
+Muitos, muitos usuĂĄrios, mas seu servidor estĂĄ esperando đŸ•™ pela conexĂŁo nĂŁo tĂŁo boa deles enviar suas requisiçÔes.
 
 E entĂŁo esperando đŸ•™ novamente as respostas voltarem.
 
@@ -269,11 +269,11 @@ EntĂŁo, para equilibrar tudo, imagine a seguinte historinha:
 
 NĂŁo hĂĄ espera đŸ•™ em lugar algum, apenas um monte de trabalho para ser feito, em mĂșltiplos cĂŽmodos da casa.
 
-VocĂȘ poderia ter turnos como no exemplo dos hambĂșrgueres, primeiro a sala de estar, entĂŁo a cozinha, mas como vocĂȘ nĂŁo estĂĄ esperando por nada, apenas limpando e limpando, as chamadas nĂŁo afetariam em nada.
+VocĂȘ poderia ter turnos como no exemplo dos hambĂșrgueres, primeiro a sala de estar, entĂŁo a cozinha, mas como vocĂȘ nĂŁo estĂĄ esperando đŸ•™ por nada, apenas limpando e limpando, as chamadas nĂŁo afetariam em nada.
 
 Levaria o mesmo tempo para finalizar com ou sem turnos (concorrĂȘncia) e vocĂȘ teria feito o mesmo tanto de trabalho.
 
-Mas nesse caso, se vocĂȘ trouxesse os 8 ex-caixas / cozinheiros / agora-faxineiros, e cada um deles (mais vocĂȘ) pudessem dividir a casa para limpĂĄ-la, vocĂȘs fariam toda a limpeza em **paralelo**, com a ajuda extra, e terminariam muito mais cedo.
+Mas nesse caso, se vocĂȘ trouxesse os 8 ex-caixas/cozinheiros/agora-faxineiros, e cada um deles (mais vocĂȘ) pudessem dividir a casa para limpĂĄ-la, vocĂȘs fariam toda a limpeza em **paralelo**, com a ajuda extra, e terminariam muito mais cedo.
 
 Nesse cenĂĄrio, cada um dos faxineiros (incluindo vocĂȘ) poderia ser um processador, fazendo a sua parte do trabalho.
 
@@ -285,18 +285,18 @@ Exemplos comuns de operaçÔes limitadas por CPU sĂŁo coisas que exigem processa
 
 Por exemplo:
 
-* **Processamento de ĂĄudio** ou **imagem**
-* **VisĂŁo Computacional**: uma imagem Ă© composta por milhĂ”es de pixels, cada pixel tem 3 valores / cores, processar isso normalmente exige alguma computação em todos esses pixels ao mesmo tempo
-* **Aprendizado de MĂĄquina**: Normalmente exige muita multiplicação de matrizes e vetores. Pense numa grande planilha com nĂșmeros e em multiplicar todos eles juntos e ao mesmo tempo.
-* **Deep Learning**: Esse Ă© um subcampo do Aprendizado de MĂĄquina, entĂŁo, o mesmo se aplica. A diferença Ă© que nĂŁo hĂĄ apenas uma grande planilha com nĂșmeros para multiplicar, mas um grande conjunto delas, e em muitos casos, vocĂȘ utiliza um processador especial para construir e/ou usar esses modelos.
+* **Processamento de ĂĄudio** ou **imagem**.
+* **VisĂŁo Computacional**: uma imagem Ă© composta por milhĂ”es de pixels, cada pixel tem 3 valores / cores, processar isso normalmente exige alguma computação nesses pixels, todos ao mesmo tempo.
+* **Aprendizado de MĂĄquina**: normalmente exige muita multiplicação de "matrizes" e "vetores". Pense numa grande planilha com nĂșmeros e em multiplicar todos eles juntos e ao mesmo tempo.
+* **Deep Learning**: esse Ă© um subcampo do Aprendizado de MĂĄquina, entĂŁo, o mesmo se aplica. A diferença Ă© que nĂŁo hĂĄ apenas uma planilha com nĂșmeros para multiplicar, mas um grande conjunto delas, e em muitos casos, vocĂȘ utiliza um processador especial para construir e / ou usar esses modelos.
 
 ### ConcorrĂȘncia + Paralelismo: Web + Aprendizado de MĂĄquina { #concurrency-parallelism-web-machine-learning }
 
 Com **FastAPI** vocĂȘ pode levar a vantagem da concorrĂȘncia que Ă© muito comum para desenvolvimento web (o mesmo atrativo de NodeJS).
 
-Mas vocĂȘ tambĂ©m pode explorar os benefĂ­cios do paralelismo e multiprocessamento (tendo mĂșltiplos processadores rodando em paralelo) para trabalhos **limitados por CPU** como aqueles em sistemas de Aprendizado de MĂĄquina.
+Mas vocĂȘ tambĂ©m pode explorar os benefĂ­cios do paralelismo e multiprocessamento (tendo mĂșltiplos processos rodando em paralelo) para trabalhos **limitados por CPU** como aqueles em sistemas de Aprendizado de MĂĄquina.
 
-Isso, somado ao simples fato que Python Ă© a principal linguagem para **Data Science**, Aprendizado de MĂĄquina e especialmente Deep Learning, faz do FastAPI uma Ăłtima escolha para APIs web e aplicaçÔes com Data Science / Aprendizado de MĂĄquina (entre muitas outras).
+Isso, somado ao simples fato que Python Ă© a principal linguagem para **Data Science**, Aprendizado de MĂĄquina e especialmente Deep Learning, faz do FastAPI uma Ăłtima escolha para APIs web e aplicaçÔes de Data Science / Aprendizado de MĂĄquina (entre muitas outras).
 
 Para ver como alcançar esse paralelismo em produção veja a seção sobre [Implantação](deployment/index.md).
 
@@ -340,7 +340,7 @@ burgers = get_burgers(2)
 
 ---
 
-EntĂŁo, se vocĂȘ estĂĄ usando uma biblioteca que diz que vocĂȘ pode chamĂĄ-la com `await`, vocĂȘ precisa criar as *funçÔes de operação de rota* com `async def`, como em:
+EntĂŁo, se vocĂȘ estĂĄ usando uma biblioteca que diz que vocĂȘ pode chamĂĄ-la com `await`, vocĂȘ precisa criar as *funçÔes de operação de rota* que a utilizam com `async def`, como em:
 
 ```Python hl_lines="2-3"
 @app.get('/burgers')
@@ -355,9 +355,9 @@ VocĂȘ deve ter observado que `await` pode ser usado somente dentro de funçÔes
 
 Mas ao mesmo tempo, funçÔes definidas com `async def` tĂȘm que ser "aguardadas". EntĂŁo, funçÔes com `async def` podem ser chamadas somente dentro de funçÔes definidas com `async def` tambĂ©m.
 
-EntĂŁo, sobre o ovo e a galinha, como vocĂȘ chama a primeira função async?
+EntĂŁo, sobre o ovo e a galinha, como vocĂȘ chama a primeira função `async`?
 
-Se vocĂȘ estivar trabalhando com **FastAPI** nĂŁo terĂĄ que se preocupar com isso, porquĂȘ essa "primeira" função serĂĄ a sua *função de operação de rota*, e o FastAPI saberĂĄ como fazer a coisa certa.
+Se vocĂȘ estiver trabalhando com **FastAPI** nĂŁo terĂĄ que se preocupar com isso, porquĂȘ essa "primeira" função serĂĄ a sua *função de operação de rota*, e o FastAPI saberĂĄ como fazer a coisa certa.
 
 Mas se vocĂȘ quiser usar `async` / `await` sem FastAPI, vocĂȘ tambĂ©m pode fazĂȘ-lo.
 
@@ -423,7 +423,7 @@ Ainda, em ambas as situaçÔes, as chances sĂŁo que o **FastAPI** [ainda serĂĄ m
 
 ### DependĂȘncias { #dependencies }
 
-O mesmo se aplica para as [dependĂȘncias](tutorial/dependencies/index.md). Se uma dependĂȘncia tem as funçÔes com padrĂŁo `def` ao invĂ©s de `async def`, ela Ă© rodada no threadpool externo.
+O mesmo se aplica para as [dependĂȘncias](tutorial/dependencies/index.md). Se uma dependĂȘncia Ă© uma função `def` padrĂŁo ao invĂ©s de `async def`, ela Ă© rodada no threadpool externo.
 
 ### Sub-dependĂȘncias { #sub-dependencies }
 
@@ -435,7 +435,7 @@ Qualquer outra função de utilidade que vocĂȘ chame diretamente pode ser criada
 
 Isso estĂĄ em contraste Ă s funçÔes que o FastAPI chama para vocĂȘ: *funçÔes de operação de rota* e dependĂȘncias.
 
-Se sua função de utilidade Ă© uma função normal com `def`, ela serĂĄ chamada diretamente (como vocĂȘ a escreve no cĂłdigo), nĂŁo em uma threadpool, se a função Ă© criada com `async def` entĂŁo vocĂȘ deve esperar por essa função quando vocĂȘ chamĂĄ-la no seu cĂłdigo.
+Se sua função de utilidade Ă© uma função normal com `def`, ela serĂĄ chamada diretamente (como vocĂȘ a escreve no cĂłdigo), nĂŁo em uma threadpool, se a função Ă© criada com `async def` entĂŁo vocĂȘ deveria usar `await` nessa função quando vocĂȘ chamĂĄ-la no seu cĂłdigo.
 
 ---
 
index 4b0eb9553f6ef5f7602de5a2964ba31039ed0490..68a2fd003674f9f717d33924bfb7dd790b9215e4 100644 (file)
@@ -16,7 +16,7 @@ FastAPI Cloud Ă© o patrocinador principal e provedor de financiamento dos projet
 
 ## Provedores de Nuvem - Patrocinadores { #cloud-providers-sponsors }
 
-Alguns outros provedores de nuvem âœš [**patrocinam o FastAPI**](../help-fastapi.md#sponsor-the-author) âœš tambĂ©m. đŸ™‡
+Alguns outros provedores de nuvem âœš [**patrocinam o FastAPI**](https://github.com/sponsors/tiangolo) âœš tambĂ©m. đŸ™‡
 
 VocĂȘ tambĂ©m pode considerĂĄ-los para seguir seus tutoriais e experimentar seus serviços:
 
index e6338d5eaf676a285cf032cad30bb13dc3b49371..0625c6d64fdb0330e5b5c29d3613d0223ea98289 100644 (file)
@@ -1,6 +1,6 @@
 # Conceitos de ImplantaçÔes { #deployments-concepts }
 
-Ao implantar um aplicativo **FastAPI**, ou na verdade, qualquer tipo de API da web, hĂĄ vĂĄrios conceitos com os quais vocĂȘ provavelmente se importa e, usando-os, vocĂȘ pode encontrar a maneira **mais apropriada** de **implantar seu aplicativo**.
+Ao implantar uma aplicação **FastAPI**, ou na verdade, qualquer tipo de API da web, hĂĄ vĂĄrios conceitos com os quais vocĂȘ provavelmente se importa e, usando-os, vocĂȘ pode encontrar a maneira **mais apropriada** de **implantar sua aplicação**.
 
 Alguns dos conceitos importantes sĂŁo:
 
@@ -19,7 +19,7 @@ Vou lhe contar um pouco mais sobre esses **conceitos** aqui, e espero que isso l
 
 Ao considerar esses conceitos, vocĂȘ serĂĄ capaz de **avaliar e projetar** a melhor maneira de implantar **suas prĂłprias APIs**.
 
-Nos prĂłximos capĂ­tulos, darei a vocĂȘ mais **receitas concretas** para implantar aplicativos FastAPI.
+Nos prĂłximos capĂ­tulos, darei a vocĂȘ mais **receitas concretas** para implantar aplicaçÔes FastAPI.
 
 Mas por enquanto, vamos verificar essas importantes **ideias conceituais**. Esses conceitos tambĂ©m se aplicam a qualquer outro tipo de API da web. đŸ’Ą
 
@@ -27,7 +27,7 @@ Mas por enquanto, vamos verificar essas importantes **ideias conceituais**. Esse
 
 No [capĂ­tulo anterior sobre HTTPS](https.md) aprendemos como o HTTPS fornece criptografia para sua API.
 
-TambĂ©m vimos que o HTTPS normalmente Ă© fornecido por um componente **externo** ao seu servidor de aplicativos, um **Proxy de terminação TLS**.
+TambĂ©m vimos que o HTTPS normalmente Ă© fornecido por um componente **externo** ao seu servidor de aplicaçÔes, um **Proxy de terminação TLS**.
 
 E tem que haver algo responsĂĄvel por **renovar os certificados HTTPS**, pode ser o mesmo componente ou pode ser algo diferente.
 
@@ -75,7 +75,7 @@ A palavra **processo** normalmente Ă© usada de forma mais especĂ­fica, referindo
     * Isso nĂŁo se refere ao arquivo, nem ao cĂłdigo, refere-se **especificamente** Ă  coisa que estĂĄ sendo **executada** e gerenciada pelo sistema operacional.
 * Qualquer programa, qualquer cĂłdigo, **sĂł pode fazer coisas** quando estĂĄ sendo **executado**. EntĂŁo, quando hĂĄ um **processo em execução**.
 * O processo pode ser **terminado** (ou "morto") por vocĂȘ, ou pelo sistema operacional. Nesse ponto, ele para de rodar/ser executado, e ele **nĂŁo pode mais fazer coisas**.
-* Cada aplicativo que vocĂȘ tem em execução no seu computador tem algum processo por trĂĄs dele, cada programa em execução, cada janela, etc. E normalmente hĂĄ muitos processos em execução **ao mesmo tempo** enquanto um computador estĂĄ ligado.
+* Cada aplicação que vocĂȘ tem em execução no seu computador tem algum processo por trĂĄs dela, cada programa em execução, cada janela, etc. E normalmente hĂĄ muitos processos em execução **ao mesmo tempo** enquanto um computador estĂĄ ligado.
 * Pode haver **vĂĄrios processos** do **mesmo programa** em execução ao mesmo tempo.
 
 Se vocĂȘ verificar o "gerenciador de tarefas" ou o "monitor do sistema" (ou ferramentas semelhantes) no seu sistema operacional, poderĂĄ ver muitos desses processos em execução.
@@ -104,11 +104,11 @@ E se o servidor for reiniciado (por exemplo, apĂłs atualizaçÔes ou migraçÔes
 
 ### Executar automaticamente na inicialização { #run-automatically-on-startup }
 
-Em geral, vocĂȘ provavelmente desejarĂĄ que o programa do servidor (por exemplo, Uvicorn) seja iniciado automaticamente na inicialização do servidor e, sem precisar de nenhuma **intervenção humana**, tenha um processo sempre em execução com sua API (por exemplo, Uvicorn executando seu aplicativo FastAPI).
+Em geral, vocĂȘ provavelmente desejarĂĄ que o programa do servidor (por exemplo, Uvicorn) seja iniciado automaticamente na inicialização do servidor e, sem precisar de nenhuma **intervenção humana**, tenha um processo sempre em execução com sua API (por exemplo, Uvicorn executando sua aplicação FastAPI).
 
 ### Programa separado { #separate-program }
 
-Para conseguir isso, vocĂȘ normalmente terĂĄ um **programa separado** que garantiria que seu aplicativo fosse executado na inicialização. E em muitos casos, ele tambĂ©m garantiria que outros componentes ou aplicativos tambĂ©m fossem executados, por exemplo, um banco de dados.
+Para conseguir isso, vocĂȘ normalmente terĂĄ um **programa separado** que garantiria que sua aplicação fosse executada na inicialização. E em muitos casos, ele tambĂ©m garantiria que outros componentes ou aplicaçÔes tambĂ©m fossem executados, por exemplo, um banco de dados.
 
 ### Ferramentas de exemplo para executar na inicialização { #example-tools-to-run-at-startup }
 
@@ -127,7 +127,7 @@ Darei exemplos mais concretos nos prĂłximos capĂ­tulos.
 
 ## ReinicializaçÔes { #restarts }
 
-Semelhante a garantir que seu aplicativo seja executado na inicialização, vocĂȘ provavelmente tambĂ©m deseja garantir que ele seja **reiniciado** apĂłs falhas.
+Semelhante a garantir que sua aplicação seja executada na inicialização, vocĂȘ provavelmente tambĂ©m deseja garantir que ela seja **reiniciada** apĂłs falhas.
 
 ### NĂłs cometemos erros { #we-make-mistakes }
 
@@ -137,15 +137,15 @@ E nĂłs, como desenvolvedores, continuamos aprimorando o cĂłdigo Ă  medida que en
 
 ### Pequenos erros sĂŁo tratados automaticamente { #small-errors-automatically-handled }
 
-Ao criar APIs da web com FastAPI, se houver um erro em nosso cĂłdigo, o FastAPI normalmente o conterĂĄ na Ășnica solicitação que acionou o erro. đŸ›Ą
+Ao criar APIs da web com FastAPI, se houver um erro em nosso cĂłdigo, o FastAPI normalmente o conterĂĄ na Ășnica request que acionou o erro. đŸ›Ą
 
-O cliente receberĂĄ um **Erro Interno do Servidor 500** para essa solicitação, mas o aplicativo continuarĂĄ funcionando para as prĂłximas solicitaçÔes em vez de travar completamente.
+O cliente receberĂĄ um **Erro Interno do Servidor 500** para essa request, mas a aplicação continuarĂĄ funcionando para as prĂłximas requests em vez de travar completamente.
 
 ### Erros maiores - Travamentos { #bigger-errors-crashes }
 
-No entanto, pode haver casos em que escrevemos algum cĂłdigo que **trava todo o aplicativo**, fazendo com que o Uvicorn e o Python travem. đŸ’„
+No entanto, pode haver casos em que escrevemos algum cĂłdigo que **trava toda a aplicação**, fazendo com que o Uvicorn e o Python travem. đŸ’„
 
-E ainda assim, vocĂȘ provavelmente nĂŁo gostaria que o aplicativo permanecesse inativo porque houve um erro em um lugar, vocĂȘ provavelmente quer que ele **continue em execução** pelo menos para as *operaçÔes de rota* que nĂŁo estĂŁo quebradas.
+E ainda assim, vocĂȘ provavelmente nĂŁo gostaria que a aplicação permanecesse inativa porque houve um erro em um lugar, vocĂȘ provavelmente quer que ela **continue em execução** pelo menos para as *operaçÔes de rota* que nĂŁo estĂŁo quebradas.
 
 ### Reiniciar apĂłs falha { #restart-after-crash }
 
@@ -153,13 +153,13 @@ Mas nos casos com erros realmente graves que travam o **processo** em execução
 
 /// tip | Dica
 
-...Embora se o aplicativo inteiro estiver **travando imediatamente**, provavelmente nĂŁo faça sentido reiniciĂĄ-lo para sempre. Mas nesses casos, vocĂȘ provavelmente notarĂĄ isso durante o desenvolvimento, ou pelo menos logo apĂłs a implantação.
+...Embora se a aplicação inteira estiver **travando imediatamente**, provavelmente nĂŁo faça sentido reiniciĂĄ-la para sempre. Mas nesses casos, vocĂȘ provavelmente notarĂĄ isso durante o desenvolvimento, ou pelo menos logo apĂłs a implantação.
 
-EntĂŁo, vamos nos concentrar nos casos principais, onde ele pode travar completamente em alguns casos especĂ­ficos **no futuro**, e ainda faz sentido reiniciĂĄ-lo.
+EntĂŁo, vamos nos concentrar nos casos principais, onde ela pode travar completamente em alguns casos especĂ­ficos **no futuro**, e ainda faz sentido reiniciĂĄ-la.
 
 ///
 
-VocĂȘ provavelmente gostaria de ter a coisa responsĂĄvel por reiniciar seu aplicativo como um **componente externo**, porque a essa altura, o mesmo aplicativo com Uvicorn e Python jĂĄ havia travado, entĂŁo nĂŁo hĂĄ nada no mesmo cĂłdigo do mesmo aplicativo que possa fazer algo a respeito.
+VocĂȘ provavelmente gostaria de ter a coisa responsĂĄvel por reiniciar sua aplicação como um **componente externo**, porque a essa altura, a mesma aplicação com Uvicorn e Python jĂĄ havia travado, entĂŁo nĂŁo hĂĄ nada no mesmo cĂłdigo da mesma aplicação que possa fazer algo a respeito.
 
 ### Ferramentas de exemplo para reiniciar automaticamente { #example-tools-to-restart-automatically }
 
@@ -178,13 +178,13 @@ Por exemplo, isso poderia ser resolvido por:
 
 ## Replicação - Processos e MemĂłria { #replication-processes-and-memory }
 
-Com um aplicativo FastAPI, usando um programa de servidor como o comando `fastapi` que executa o Uvicorn, executĂĄ-lo uma vez em **um processo** pode atender a vĂĄrios clientes simultaneamente.
+Com uma aplicação FastAPI, usando um programa de servidor como o comando `fastapi` que executa o Uvicorn, executĂĄ-lo uma vez em **um processo** pode atender a vĂĄrios clientes simultaneamente.
 
 Mas em muitos casos, vocĂȘ desejarĂĄ executar vĂĄrios processos de trabalho ao mesmo tempo.
 
 ### Processos MĂșltiplos - Trabalhadores { #multiple-processes-workers }
 
-Se vocĂȘ tiver mais clientes do que um Ășnico processo pode manipular (por exemplo, se a mĂĄquina virtual nĂŁo for muito grande) e tiver **vĂĄrios nĂșcleos** na CPU do servidor, vocĂȘ poderĂĄ ter **vĂĄrios processos** em execução com o mesmo aplicativo ao mesmo tempo e distribuir todas as solicitaçÔes entre eles.
+Se vocĂȘ tiver mais clientes do que um Ășnico processo pode manipular (por exemplo, se a mĂĄquina virtual nĂŁo for muito grande) e tiver **vĂĄrios nĂșcleos** na CPU do servidor, vocĂȘ poderĂĄ ter **vĂĄrios processos** em execução com a mesma aplicação ao mesmo tempo e distribuir todas as requests entre eles.
 
 Quando vocĂȘ executa **vĂĄrios processos** do mesmo programa de API, eles sĂŁo comumente chamados de **trabalhadores**.
 
@@ -214,11 +214,11 @@ Neste exemplo, hĂĄ um **Processo Gerenciador** que inicia e controla dois **Proc
 
 Este Processo de Gerenciador provavelmente seria o que escutaria na **porta** no IP. E ele transmitiria toda a comunicação para os processos de trabalho.
 
-Esses processos de trabalho seriam aqueles que executariam seu aplicativo, eles executariam os cĂĄlculos principais para receber uma **solicitação** e retornar uma **resposta**, e carregariam qualquer coisa que vocĂȘ colocasse em variĂĄveis â€‹â€‹na RAM.
+Esses processos de trabalho seriam aqueles que executariam sua aplicação, eles executariam os cĂĄlculos principais para receber uma **request** e retornar uma **resposta**, e carregariam qualquer coisa que vocĂȘ colocasse em variĂĄveis â€‹â€‹na RAM.
 
 <img src="/img/deployment/concepts/process-ram.drawio.svg">
 
-E, claro, a mesma mĂĄquina provavelmente teria **outros processos** em execução, alĂ©m do seu aplicativo.
+E, claro, a mesma mĂĄquina provavelmente teria **outros processos** em execução, alĂ©m da sua aplicação.
 
 Um detalhe interessante Ă© que a porcentagem da **CPU usada** por cada processo pode **variar** muito ao longo do tempo, mas a **memĂłria (RAM)** normalmente fica mais ou menos **estĂĄvel**.
 
@@ -255,9 +255,9 @@ Por exemplo, vocĂȘ pode querer executar **migraçÔes de banco de dados**.
 
 Mas na maioria dos casos, vocĂȘ precisarĂĄ executar essas etapas apenas **uma vez**.
 
-Portanto, vocĂȘ vai querer ter um **processo Ășnico** para executar essas **etapas anteriores** antes de iniciar o aplicativo.
+Portanto, vocĂȘ vai querer ter um **processo Ășnico** para executar essas **etapas anteriores** antes de iniciar a aplicação.
 
-E vocĂȘ terĂĄ que se certificar de que Ă© um Ășnico processo executando essas etapas anteriores *mesmo* se depois, vocĂȘ iniciar **vĂĄrios processos** (vĂĄrios trabalhadores) para o prĂłprio aplicativo. Se essas etapas fossem executadas por **vĂĄrios processos**, eles **duplicariam** o trabalho executando-o em **paralelo**, e se as etapas fossem algo delicado como uma migração de banco de dados, elas poderiam causar conflitos entre si.
+E vocĂȘ terĂĄ que se certificar de que Ă© um Ășnico processo executando essas etapas anteriores *mesmo* se depois, vocĂȘ iniciar **vĂĄrios processos** (vĂĄrios trabalhadores) para a prĂłpria aplicação. Se essas etapas fossem executadas por **vĂĄrios processos**, eles **duplicariam** o trabalho executando-o em **paralelo**, e se as etapas fossem algo delicado como uma migração de banco de dados, elas poderiam causar conflitos entre si.
 
 Claro, hĂĄ alguns casos em que nĂŁo hĂĄ problema em executar as etapas anteriores vĂĄrias vezes; nesse caso, Ă© muito mais fĂĄcil de lidar.
 
@@ -276,7 +276,7 @@ Isso **dependerĂĄ muito** da maneira como vocĂȘ **implanta seu sistema** e prova
 Aqui estĂŁo algumas ideias possĂ­veis:
 
 * Um "Init Container" no Kubernetes que roda antes do seu app container
-* Um script bash que roda os passos anteriores e entĂŁo inicia seu aplicativo
+* Um script bash que roda os passos anteriores e entĂŁo inicia sua aplicação
     * VocĂȘ ainda precisaria de uma maneira de iniciar/reiniciar *aquele* script bash, detectar erros, etc.
 
 /// tip | Dica
@@ -307,7 +307,7 @@ VocĂȘ pode usar ferramentas simples como `htop` para ver a CPU e a RAM usadas no
 
 ## Recapitular { #recap }
 
-VocĂȘ leu aqui alguns dos principais conceitos que provavelmente precisa ter em mente ao decidir como implantar seu aplicativo:
+VocĂȘ leu aqui alguns dos principais conceitos que provavelmente precisa ter em mente ao decidir como implantar sua aplicação:
 
 * Segurança - HTTPS
 * Executando na inicialização
index e14870d7cfd0e55a67c7b966ff54500d275885f2..f68784855da90cad9df89656938ad1947fb6bc8e 100644 (file)
@@ -50,7 +50,7 @@ Uma imagem de contĂȘiner Ă© uma versĂŁo **estĂĄtica** de todos os arquivos, vari
 
 Em contraste com a "**imagem de contĂȘiner**" que contĂ©m os conteĂșdos estĂĄticos armazenados, um "**contĂȘiner**" normalmente se refere Ă  instĂąncia rodando, a coisa que estĂĄ sendo **executada**.
 
-Quando o **contĂȘiner** Ă© iniciado e estĂĄ rodando (iniciado a partir de uma **imagem de contĂȘiner**), ele pode criar ou modificar arquivos, variĂĄveis de ambiente, etc. Essas mudanças vĂŁo existir somente nesse contĂȘiner, mas nĂŁo persistirĂŁo na imagem subjacente do container (nĂŁo serĂŁo salvas no disco).
+Quando o **contĂȘiner** Ă© iniciado e estĂĄ rodando (iniciado a partir de uma **imagem de contĂȘiner**), ele pode criar ou modificar arquivos, variĂĄveis de ambiente, etc. Essas mudanças vĂŁo existir somente nesse contĂȘiner, mas nĂŁo persistirĂŁo na imagem subjacente do contĂȘiner (nĂŁo serĂŁo salvas no disco).
 
 Uma imagem de contĂȘiner Ă© comparĂĄvel ao arquivo de **programa** e seus conteĂșdos, ex.: `python` e algum arquivo `main.py`.
 
@@ -64,7 +64,7 @@ E existe um [Docker Hub](https://hub.docker.com/) pĂșblico com **imagens de cont
 
 Por exemplo, hĂĄ uma [Imagem Python](https://hub.docker.com/_/python) oficial.
 
-E existe muitas outras imagens para diferentes coisas, como bancos de dados, por exemplo:
+E existem muitas outras imagens para diferentes coisas, como bancos de dados, por exemplo:
 
 * [PostgreSQL](https://hub.docker.com/_/postgres)
 * [MySQL](https://hub.docker.com/_/mysql)
@@ -87,11 +87,11 @@ Quando um **contĂȘiner** Ă© iniciado, ele irĂĄ rodar esse comando/programa (embo
 
 Um contĂȘiner estĂĄ rodando enquanto o **processo principal** (comando ou programa) estiver rodando.
 
-Um contĂȘiner normalmente tem um **Ășnico processo**, mas tambĂ©m Ă© possĂ­vel iniciar sub-processos a partir do processo principal, e dessa forma vocĂȘ terĂĄ **vĂĄrios processos** no mesmo contĂȘiner.
+Um contĂȘiner normalmente tem um **Ășnico processo**, mas tambĂ©m Ă© possĂ­vel iniciar subprocessos a partir do processo principal, e dessa forma vocĂȘ terĂĄ **vĂĄrios processos** no mesmo contĂȘiner.
 
 Mas nĂŁo Ă© possĂ­vel ter um contĂȘiner rodando sem **pelo menos um processo rodando**. Se o processo principal parar, o contĂȘiner tambĂ©m para.
 
-## Construir uma Imagem Docker para FastAPI { #build-a-docker-image-for-fastapi }
+## Construa uma Imagem Docker para FastAPI { #build-a-docker-image-for-fastapi }
 
 Okay, vamos construir algo agora! đŸš€
 
@@ -262,7 +262,7 @@ Isso pode ser bem perceptĂ­vel ao usar `docker compose`. Veja esta seção de FA
 
 #### Estrutura de diretĂłrios { #directory-structure }
 
-Agora vocĂȘ deve haver uma estrutura de diretĂłrio como:
+Agora vocĂȘ deveria ter uma estrutura de diretĂłrio como:
 
 ```
 .
@@ -275,7 +275,7 @@ Agora vocĂȘ deve haver uma estrutura de diretĂłrio como:
 
 #### Por trĂĄs de um Proxy de Terminação TLS { #behind-a-tls-termination-proxy }
 
-Se vocĂȘ estĂĄ executando seu contĂȘiner atrĂĄs de um Proxy de Terminação TLS (load balancer) como Nginx ou Traefik, adicione a opção `--proxy-headers`, isso farĂĄ com que o Uvicorn (pela CLI do FastAPI) confie nos cabeçalhos enviados por esse proxy, informando que o aplicativo estĂĄ sendo executado atrĂĄs do HTTPS, etc.
+Se vocĂȘ estĂĄ executando seu contĂȘiner atrĂĄs de um Proxy de Terminação TLS (balanceador de carga) como Nginx ou Traefik, adicione a opção `--proxy-headers`, isso farĂĄ com que o Uvicorn (pela CLI do FastAPI) confie nos cabeçalhos enviados por esse proxy, informando que o aplicativo estĂĄ sendo executado atrĂĄs do HTTPS, etc.
 
 ```Dockerfile
 CMD ["fastapi", "run", "app/main.py", "--proxy-headers", "--port", "80"]
@@ -289,7 +289,7 @@ Existe um truque importante nesse `Dockerfile`, primeiro copiamos o **arquivo co
 COPY ./requirements.txt /code/requirements.txt
 ```
 
-Docker e outras ferramentas **constrĂłem** essas imagens de contĂȘiner **incrementalmente**, adicionando **uma camada em cima da outra**, começando do topo do `Dockerfile` e adicionando qualquer arquivo criado por cada uma das instruçÔes do `Dockerfile`.
+Docker e outras ferramentas **constroem** essas imagens de contĂȘiner **incrementalmente**, adicionando **uma camada em cima da outra**, começando do topo do `Dockerfile` e adicionando qualquer arquivo criado por cada uma das instruçÔes do `Dockerfile`.
 
 Docker e ferramentas similares tambĂ©m usam um **cache interno** ao construir a imagem, se um arquivo nĂŁo mudou desde a Ășltima vez que a imagem do contĂȘiner foi construĂ­da, entĂŁo ele irĂĄ **reutilizar a mesma camada** criada na Ășltima vez, ao invĂ©s de copiar o arquivo novamente e criar uma nova camada do zero.
 
@@ -352,7 +352,7 @@ $ docker run -d --name mycontainer -p 80:80 myimage
 
 ## Verifique { #check-it }
 
-VocĂȘ deve ser capaz de verificar isso no URL do seu contĂȘiner Docker, por exemplo: [http://192.168.99.100/items/5?q=somequery](http://192.168.99.100/items/5?q=somequery) ou [http://127.0.0.1/items/5?q=somequery](http://127.0.0.1/items/5?q=somequery) (ou equivalente, usando seu host Docker).
+VocĂȘ deveria conseguir verificar isso no URL do seu contĂȘiner Docker, por exemplo: [http://192.168.99.100/items/5?q=somequery](http://192.168.99.100/items/5?q=somequery) ou [http://127.0.0.1/items/5?q=somequery](http://127.0.0.1/items/5?q=somequery) (ou equivalente, usando seu host Docker).
 
 VocĂȘ verĂĄ algo como:
 
@@ -376,9 +376,9 @@ VocĂȘ verĂĄ a documentação alternativa automĂĄtica (fornecida pelo [ReDoc](htt
 
 ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
 
-## Construa uma Imagem Docker com um FastAPI de Arquivo Ăšnico { #build-a-docker-image-with-a-single-file-fastapi }
+## Construa uma Imagem Docker com uma aplicação FastAPI de Arquivo Ăšnico { #build-a-docker-image-with-a-single-file-fastapi }
 
-Se seu FastAPI for um Ășnico arquivo, por exemplo, `main.py` sem um diretĂłrio `./app`, sua estrutura de arquivos poderia ser assim:
+Se sua aplicação FastAPI for um Ășnico arquivo, por exemplo, `main.py` sem um diretĂłrio `./app`, sua estrutura de arquivos poderia ser assim:
 
 ```
 .
@@ -456,7 +456,7 @@ Sem usar contĂȘineres, fazer aplicativos executarem na inicialização e com rei
 
 Se vocĂȘ tiver um <dfn title="Um grupo de mĂĄquinas que sĂŁo configuradas para estarem conectadas e trabalharem juntas de alguma forma.">cluster</dfn> de mĂĄquinas com **Kubernetes**, Docker Swarm Mode, Nomad ou outro sistema complexo semelhante para gerenciar contĂȘineres distribuĂ­dos em vĂĄrias mĂĄquinas, entĂŁo provavelmente desejarĂĄ **lidar com a replicação** no **nĂ­vel do cluster** em vez de usar um **gerenciador de processos** (como Uvicorn com workers) em cada contĂȘiner.
 
-Um desses sistemas de gerenciamento de contĂȘineres distribuĂ­dos como o Kubernetes normalmente tem alguma maneira integrada de lidar com a **replicação de contĂȘineres** enquanto ainda oferece **balanceamento de carga** para as solicitaçÔes recebidas. Tudo no **nĂ­vel do cluster**.
+Um desses sistemas de gerenciamento de contĂȘineres distribuĂ­dos como o Kubernetes normalmente tem alguma maneira integrada de lidar com a **replicação de contĂȘineres** enquanto ainda oferece **balanceamento de carga** para os requests recebidos. Tudo no **nĂ­vel do cluster**.
 
 Nesses casos, vocĂȘ provavelmente desejarĂĄ criar uma **imagem Docker do zero** como [explicado acima](#dockerfile), instalando suas dependĂȘncias e executando **um Ășnico processo Uvicorn** em vez de usar mĂșltiplos workers do Uvicorn.
 
@@ -464,7 +464,7 @@ Nesses casos, vocĂȘ provavelmente desejarĂĄ criar uma **imagem Docker do zero**
 
 Quando usando contĂȘineres, normalmente vocĂȘ terĂĄ algum componente **escutando na porta principal**. Poderia ser outro contĂȘiner que tambĂ©m Ă© um **Proxy de Terminação TLS** para lidar com **HTTPS** ou alguma ferramenta semelhante.
 
-Como esse componente assumiria a **carga** de solicitaçÔes e distribuiria isso entre os workers de uma maneira (esperançosamente) **balanceada**, ele tambĂ©m Ă© comumente chamado de **Balanceador de Carga**.
+Como esse componente assumiria a **carga** de requests e distribuiria isso entre os workers de uma maneira (esperançosamente) **balanceada**, ele tambĂ©m Ă© comumente chamado de **Balanceador de Carga**.
 
 /// tip | Dica
 
@@ -472,17 +472,17 @@ O mesmo componente **Proxy de Terminação TLS** usado para HTTPS provavelmente
 
 ///
 
-E quando trabalhar com contĂȘineres, o mesmo sistema que vocĂȘ usa para iniciar e gerenciĂĄ-los jĂĄ terĂĄ ferramentas internas para transmitir a **comunicação de rede** (por exemplo, solicitaçÔes HTTP) do **balanceador de carga** (que tambĂ©m pode ser um **Proxy de Terminação TLS**) para o(s) contĂȘiner(es) com seu aplicativo.
+E quando trabalhar com contĂȘineres, o mesmo sistema que vocĂȘ usa para iniciar e gerenciĂĄ-los jĂĄ terĂĄ ferramentas internas para transmitir a **comunicação de rede** (por exemplo, requests HTTP) do **balanceador de carga** (que tambĂ©m pode ser um **Proxy de Terminação TLS**) para o(s) contĂȘiner(es) com seu aplicativo.
 
 ### Um Balanceador de Carga - MĂșltiplos ContĂȘineres de Workers { #one-load-balancer-multiple-worker-containers }
 
-Quando trabalhando com **Kubernetes** ou sistemas similares de gerenciamento de contĂȘiner distribuĂ­do, usar seus mecanismos de rede internos permite que o Ășnico **balanceador de carga** que estĂĄ escutando na **porta principal** transmita a comunicação (solicitaçÔes) para possivelmente **mĂșltiplos contĂȘineres** executando seu aplicativo.
+Quando trabalhando com **Kubernetes** ou sistemas similares de gerenciamento de contĂȘiner distribuĂ­do, usar seus mecanismos de rede internos permite que o Ășnico **balanceador de carga** que estĂĄ escutando na **porta principal** transmita a comunicação (requests) para possivelmente **mĂșltiplos contĂȘineres** executando seu aplicativo.
 
 Cada um desses contĂȘineres executando seu aplicativo normalmente teria **apenas um processo** (ex.: um processo Uvicorn executando seu aplicativo FastAPI). Todos seriam **contĂȘineres idĂȘnticos**, executando a mesma coisa, mas cada um com seu prĂłprio processo, memĂłria, etc. Dessa forma, vocĂȘ aproveitaria a **paralelização** em **nĂșcleos diferentes** da CPU, ou atĂ© mesmo em **mĂĄquinas diferentes**.
 
-E o sistema de contĂȘiner com o **balanceador de carga** iria **distribuir as solicitaçÔes** para cada um dos contĂȘineres com seu aplicativo **em turnos**. Portanto, cada solicitação poderia ser tratada por um dos mĂșltiplos **contĂȘineres replicados** executando seu aplicativo.
+E o sistema de contĂȘiner com o **balanceador de carga** iria **distribuir os requests** para cada um dos contĂȘineres com seu aplicativo **em turnos**. Portanto, cada request poderia ser tratado por um dos mĂșltiplos **contĂȘineres replicados** executando seu aplicativo.
 
-E normalmente esse **balanceador de carga** seria capaz de lidar com solicitaçÔes que vĂŁo para *outros* aplicativos em seu cluster (por exemplo, para um domĂ­nio diferente, ou sob um prefixo de URL diferente), e transmitiria essa comunicação para os contĂȘineres certos para *esse outro* aplicativo em execução em seu cluster.
+E normalmente esse **balanceador de carga** seria capaz de lidar com requests que vĂŁo para *outros* aplicativos em seu cluster (por exemplo, para um domĂ­nio diferente, ou sob um prefixo de path de URL diferente), e transmitiria essa comunicação para os contĂȘineres certos para *esse outro* aplicativo em execução em seu cluster.
 
 ### Um Processo por ContĂȘiner { #one-process-per-container }
 
@@ -544,7 +544,7 @@ Se vocĂȘ executar **um Ășnico processo por contĂȘiner**, terĂĄ uma quantidade ma
 
 E entĂŁo vocĂȘ pode definir esses mesmos limites e requisitos de memĂłria em suas configuraçÔes para seu sistema de gerenciamento de contĂȘineres (por exemplo, no **Kubernetes**). Dessa forma, ele poderĂĄ **replicar os contĂȘineres** nas **mĂĄquinas disponĂ­veis** levando em consideração a quantidade de memĂłria necessĂĄria por eles e a quantidade disponĂ­vel nas mĂĄquinas no cluster.
 
-Se sua aplicação for **simples**, isso provavelmente **nĂŁo serĂĄ um problema**, e vocĂȘ pode nĂŁo precisar especificar limites de memĂłria rĂ­gidos. Mas se vocĂȘ estiver **usando muita memĂłria** (por exemplo, com **modelos de aprendizado de mĂĄquina**), deve verificar quanta memĂłria estĂĄ consumindo e ajustar o **nĂșmero de contĂȘineres** que executa em **cada mĂĄquina** (e talvez adicionar mais mĂĄquinas ao seu cluster).
+Se sua aplicação for **simples**, isso provavelmente **nĂŁo serĂĄ um problema**, e vocĂȘ pode nĂŁo precisar especificar limites de memĂłria rĂ­gidos. Mas se vocĂȘ estiver **usando muita memĂłria** (por exemplo, com modelos de **Aprendizado de MĂĄquina**), vocĂȘ deveria verificar quanta memĂłria estĂĄ consumindo e ajustar o **nĂșmero de contĂȘineres** que executa em **cada mĂĄquina** (e talvez adicionar mais mĂĄquinas ao seu cluster).
 
 Se vocĂȘ executar **mĂșltiplos processos por contĂȘiner**, deve garantir que o nĂșmero de processos iniciados nĂŁo **consuma mais memĂłria** do que o disponĂ­vel.
 
@@ -572,7 +572,7 @@ Se vocĂȘ tiver uma configuração simples, com um **Ășnico contĂȘiner** que ent
 
 Antes havia uma imagem oficial do FastAPI para Docker: [tiangolo/uvicorn-gunicorn-fastapi](https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker). Mas agora ela estĂĄ descontinuada. â›”
 
-VocĂȘ provavelmente **nĂŁo** deve usar essa imagem base do Docker (ou qualquer outra semelhante).
+VocĂȘ provavelmente **nĂŁo** deveria usar essa imagem base do Docker (ou qualquer outra semelhante).
 
 Se vocĂȘ estĂĄ usando **Kubernetes** (ou outros) e jĂĄ estĂĄ definindo a **replicação** no nĂ­vel do cluster, com vĂĄrios **contĂȘineres**. Nesses casos, Ă© melhor **construir uma imagem do zero** como descrito acima: [Construir uma Imagem Docker para FastAPI](#build-a-docker-image-for-fastapi).
 
index 0e8ae2ba644b73371d3b09b6fd1df9a6f70145f4..d89e0bbfff579de32e0d90d3587160658bb9abbb 100644 (file)
@@ -10,31 +10,31 @@ Se vocĂȘ estĂĄ com pressa ou nĂŁo se importa, continue com as seçÔes seguintes
 
 ///
 
-Para aprender o bĂĄsico de HTTPS do ponto de vista do consumidor, verifique [https://howhttps.works/](https://howhttps.works/).
-
-Agora, a partir de uma perspectiva do desenvolvedor, aqui estĂŁo algumas coisas para ter em mente ao pensar em HTTPS:
-
-* Para HTTPS, o servidor precisa ter "certificados" gerados por um terceiro.
-    * Esses certificados sĂŁo na verdade adquiridos de um terceiro, eles nĂŁo sĂŁo simplesmente "gerados".
-* Certificados tĂȘm um tempo de vida.
-    * Eles expiram.
-    * E entĂŁo eles precisam ser renovados, adquirindo-os novamente de um terceiro.
-* A criptografia da conexĂŁo acontece no nĂ­vel TCP.
-    * Essa Ă© uma camada abaixo do HTTP.
-    * Portanto, o manuseio do certificado e da criptografia Ă© feito antes do HTTP.
-* O TCP nĂŁo sabe sobre "domĂ­nios". Apenas sobre endereços IP.
-    * As informaçÔes sobre o domĂ­nio especĂ­fico solicitado vĂŁo nos dados HTTP.
-* Os certificados HTTPS â€œcertificam” um determinado domĂ­nio, mas o protocolo e a encriptação acontecem ao nĂ­vel do TCP, antes de sabermos de que domĂ­nio se trata.
-* Por padrĂŁo, isso significa que vocĂȘ sĂł pode ter um certificado HTTPS por endereço IP.
+Para **aprender o bĂĄsico de HTTPS**, do ponto de vista do consumidor, verifique [https://howhttps.works/](https://howhttps.works/).
+
+Agora, a partir de uma **perspectiva do desenvolvedor**, aqui estĂŁo algumas coisas para ter em mente ao pensar em HTTPS:
+
+* Para HTTPS, **o servidor** precisa **ter "certificados"** gerados por um **terceiro**.
+    * Esses certificados sĂŁo na verdade **adquiridos** de um terceiro, eles nĂŁo sĂŁo simplesmente "gerados".
+* Certificados tĂȘm um **tempo de vida**.
+    * Eles **expiram**.
+    * E entĂŁo eles precisam ser **renovados**, **adquiridos novamente** de um terceiro.
+* A criptografia da conexĂŁo acontece no **nĂ­vel TCP**.
+    * Essa Ă© uma camada **abaixo do HTTP**.
+    * Portanto, o manuseio do **certificado e da criptografia** Ă© feito **antes do HTTP**.
+* **O TCP nĂŁo sabe sobre "domĂ­nios"**. Apenas sobre endereços IP.
+    * As informaçÔes sobre o **domĂ­nio especĂ­fico** solicitado vĂŁo nos **dados HTTP**.
+* Os **certificados HTTPS** â€œcertificam” um **determinado domĂ­nio**, mas o protocolo e a encriptação acontecem ao nĂ­vel do TCP, **antes de sabermos** de que domĂ­nio se trata.
+* **Por padrĂŁo**, isso significa que vocĂȘ sĂł pode ter **um certificado HTTPS por endereço IP**.
     * NĂŁo importa o tamanho do seu servidor ou quĂŁo pequeno cada aplicativo que vocĂȘ tem nele possa ser.
-    * No entanto, existe uma solução para isso.
-* HĂĄ uma extensĂŁo para o protocolo TLS (aquele que lida com a criptografia no nĂ­vel TCP, antes do HTTP) chamada [<abbr title="Server Name Indication - Indicação do Nome do Servidor">SNI</abbr>](https://en.wikipedia.org/wiki/Server_Name_Indication).
-    * Esta extensĂŁo SNI permite que um Ășnico servidor (com um Ășnico endereço IP) tenha vĂĄrios certificados HTTPS e atenda a vĂĄrios domĂ­nios / aplicativos HTTPS.
-    * Para que isso funcione, um Ășnico componente (programa) em execução no servidor, ouvindo no endereço IP pĂșblico, deve ter todos os certificados HTTPS no servidor.
-* Depois de obter uma conexĂŁo segura, o protocolo de comunicação ainda Ă© HTTP.
-    * Os conteĂșdos sĂŁo criptografados, embora sejam enviados com o protocolo HTTP.
+    * No entanto, existe uma **solução** para isso.
+* HĂĄ uma **extensĂŁo** para o protocolo **TLS** (aquele que lida com a criptografia no nĂ­vel TCP, antes do HTTP) chamada **[<abbr title="Server Name Indication - Indicação do Nome do Servidor">SNI</abbr>](https://en.wikipedia.org/wiki/Server_Name_Indication)**.
+    * Esta extensĂŁo SNI permite que um Ășnico servidor (com um **Ășnico endereço IP**) tenha **vĂĄrios certificados HTTPS** e atenda a **vĂĄrios domĂ­nios / aplicativos HTTPS**.
+    * Para que isso funcione, um **Ășnico** componente (programa) em execução no servidor, ouvindo no **endereço IP pĂșblico**, deve ter **todos os certificados HTTPS** no servidor.
+* **Depois** de obter uma conexĂŁo segura, o protocolo de comunicação ainda Ă© **HTTP**.
+    * Os conteĂșdos sĂŁo **criptografados**, embora sejam enviados com o **protocolo HTTP**.
 
-É uma prĂĄtica comum ter um programa/servidor HTTP em execução no servidor (mĂĄquina, host, etc.) e gerenciar todas as partes HTTPS: recebendo as requisiçÔes HTTPS encriptadas, enviando as solicitaçÔes HTTP descriptografadas para o aplicativo HTTP real em execução no mesmo servidor (a aplicação FastAPI, neste caso), pegar a resposta HTTP do aplicativo, criptografĂĄ-la usando o certificado HTTPS apropriado e enviĂĄ-la de volta ao cliente usando HTTPS. Este servidor Ă© frequentemente chamado de [Proxy de Terminação TLS](https://en.wikipedia.org/wiki/TLS_termination_proxy).
+É uma prĂĄtica comum ter **um programa/servidor HTTP** em execução no servidor (mĂĄquina, host, etc.) e **gerenciar todas as partes HTTPS**: recebendo as **requisiçÔes HTTPS encriptadas**, enviando as **solicitaçÔes HTTP descriptografadas** para o aplicativo HTTP real em execução no mesmo servidor (a aplicação **FastAPI**, neste caso), pegar a **resposta HTTP** do aplicativo, **criptografĂĄ-la** usando o **certificado HTTPS** apropriado e enviĂĄ-la de volta ao cliente usando **HTTPS**. Este servidor Ă© frequentemente chamado de **[Proxy de Terminação TLS](https://en.wikipedia.org/wiki/TLS_termination_proxy)**.
 
 Algumas das opçÔes que vocĂȘ pode usar como Proxy de Terminação TLS sĂŁo:
 
@@ -45,17 +45,17 @@ Algumas das opçÔes que vocĂȘ pode usar como Proxy de Terminação TLS sĂŁo:
 
 ## Let's Encrypt { #lets-encrypt }
 
-Antes de Let's Encrypt, esses certificados HTTPS eram vendidos por terceiros confiĂĄveis.
+Antes de Let's Encrypt, esses **certificados HTTPS** eram vendidos por terceiros confiĂĄveis.
 
 O processo de aquisição de um desses certificados costumava ser complicado, exigia bastante papelada e os certificados eram bastante caros.
 
-Mas entĂŁo o [Let's Encrypt](https://letsencrypt.org/) foi criado.
+Mas entĂŁo o **[Let's Encrypt](https://letsencrypt.org/)** foi criado.
 
-Ele Ă© um projeto da Linux Foundation que fornece certificados HTTPS gratuitamente. De forma automatizada. Esses certificados usam toda a segurança criptogrĂĄfica padrĂŁo e tĂȘm vida curta (cerca de 3 meses), entĂŁo a segurança Ă©, na verdade, melhor por causa do seu lifespan reduzido.
+Ele Ă© um projeto da Linux Foundation. Ele fornece **certificados HTTPS gratuitamente**, de forma automatizada. Esses certificados usam toda a segurança criptogrĂĄfica padrĂŁo e tĂȘm vida curta (cerca de 3 meses), entĂŁo a **segurança Ă©, na verdade, melhor** por causa do seu lifespan reduzido.
 
 Os domĂ­nios sĂŁo verificados com segurança e os certificados sĂŁo gerados automaticamente. Isso tambĂ©m permite automatizar a renovação desses certificados.
 
-A ideia Ă© automatizar a aquisição e renovação desses certificados, para que vocĂȘ tenha HTTPS seguro, de graça e para sempre.
+A ideia Ă© automatizar a aquisição e renovação desses certificados, para que vocĂȘ tenha **HTTPS seguro, de graça e para sempre**.
 
 ## HTTPS para Desenvolvedores { #https-for-developers }
 
@@ -63,11 +63,11 @@ Aqui estĂĄ um exemplo de como uma API HTTPS poderia ser estruturada, passo a pas
 
 ### Nome do domĂ­nio { #domain-name }
 
-A etapa inicial provavelmente seria adquirir algum nome de domĂ­nio. EntĂŁo, vocĂȘ iria configurĂĄ-lo em um servidor DNS (possivelmente no mesmo provedor em nuvem).
+A etapa inicial provavelmente seria **adquirir** algum **nome de domĂ­nio**. EntĂŁo, vocĂȘ iria configurĂĄ-lo em um servidor DNS (possivelmente no mesmo provedor em nuvem).
 
-VocĂȘ provavelmente usaria um servidor em nuvem (mĂĄquina virtual) ou algo parecido, e ele teria um <dfn title="NĂŁo muda ao longo do tempo. NĂŁo Ă© dinĂąmico.">fixo</dfn> Endereço IP pĂșblico.
+VocĂȘ provavelmente usaria um servidor em nuvem (mĂĄquina virtual) ou algo parecido, e ele teria um **endereço IP pĂșblico** <dfn title="NĂŁo muda ao longo do tempo. NĂŁo Ă© dinĂąmico.">fixo</dfn>.
 
-No(s) servidor(es) DNS, vocĂȘ configuraria um registro (um `A record`) para apontar seu domĂ­nio para o endereço IP pĂșblico do seu servidor.
+No(s) servidor(es) DNS, vocĂȘ configuraria um registro (um "`A record`") para apontar **seu domĂ­nio** para o **endereço IP pĂșblico do seu servidor**.
 
 VocĂȘ provavelmente farĂĄ isso apenas uma vez, na primeira vez em que tudo estiver sendo configurado.
 
@@ -81,120 +81,120 @@ Essa parte do Nome do DomĂ­nio se dĂĄ muito antes do HTTPS, mas como tudo depend
 
 Agora vamos focar em todas as partes que realmente fazem parte do HTTPS.
 
-Primeiro, o navegador iria verificar com os servidores DNS qual o IP do domĂ­nio, nesse caso, `someapp.example.com`.
+Primeiro, o navegador iria verificar com os **servidores DNS** qual o **IP do domĂ­nio**, nesse caso, `someapp.example.com`.
 
-Os servidores DNS iriam informar o navegador para utilizar algum endereço IP especĂ­fico. Esse seria o endereço IP pĂșblico em uso no seu servidor, que vocĂȘ configurou nos servidores DNS.
+Os servidores DNS iriam informar o navegador para utilizar algum **endereço IP** especĂ­fico. Esse seria o endereço IP pĂșblico em uso no seu servidor, que vocĂȘ configurou nos servidores DNS.
 
 <img src="/img/deployment/https/https01.drawio.svg">
 
 ### InĂ­cio do Handshake TLS { #tls-handshake-start }
 
-O navegador entĂŁo irĂĄ comunicar-se com esse endereço IP na porta 443 (a porta HTTPS).
+O navegador entĂŁo irĂĄ comunicar-se com esse endereço IP na **porta 443** (a porta HTTPS).
 
 A primeira parte dessa comunicação Ă© apenas para estabelecer a conexĂŁo entre o cliente e o servidor e para decidir as chaves criptogrĂĄficas a serem utilizadas, etc.
 
 <img src="/img/deployment/https/https02.drawio.svg">
 
-Esse interação entre o cliente e o servidor para estabelecer uma conexĂŁo TLS Ă© chamada de Handshake TLS.
+Esse interação entre o cliente e o servidor para estabelecer uma conexĂŁo TLS Ă© chamada de **Handshake TLS**.
 
 ### TLS com a ExtensĂŁo SNI { #tls-with-sni-extension }
 
-Apenas um processo no servidor pode se conectar a uma porta em um endereço IP. Poderiam existir outros processos conectados em outras portas desse mesmo endereço IP, mas apenas um para cada combinação de endereço IP e porta.
+**Apenas um processo** no servidor pode se conectar a uma **porta** em um **endereço IP**. Poderiam existir outros processos conectados em outras portas desse mesmo endereço IP, mas apenas um para cada combinação de endereço IP e porta.
 
 TLS (HTTPS) usa a porta `443` por padrĂŁo. EntĂŁo essa Ă© a porta que precisamos.
 
-Como apenas um Ășnico processo pode se comunicar com essa porta, o processo que faria isso seria o Proxy de Terminação TLS.
+Como apenas um Ășnico processo pode se comunicar com essa porta, o processo que faria isso seria o **Proxy de Terminação TLS**.
 
-O Proxy de Terminação TLS teria acesso a um ou mais certificados TLS (certificados HTTPS).
+O Proxy de Terminação TLS teria acesso a um ou mais **certificados TLS** (certificados HTTPS).
 
-Utilizando a extensĂŁo SNI discutida acima, o Proxy de Terminação TLS iria checar qual dos certificados TLS (HTTPS) disponĂ­veis deve ser usado para essa conexĂŁo, utilizando o que corresponda ao domĂ­nio esperado pelo cliente.
+Utilizando a **extensĂŁo SNI** discutida acima, o Proxy de Terminação TLS iria checar qual dos certificados TLS (HTTPS) disponĂ­veis deve ser usado para essa conexĂŁo, utilizando o que corresponda ao domĂ­nio esperado pelo cliente.
 
 Nesse caso, ele usaria o certificado para `someapp.example.com`.
 
 <img src="/img/deployment/https/https03.drawio.svg">
 
-O cliente jĂĄ confia na entidade que gerou o certificado TLS (nesse caso, o Let's Encrypt, mas veremos sobre isso mais tarde), entĂŁo ele pode verificar que o certificado Ă© vĂĄlido.
+O cliente jĂĄ **confia** na entidade que gerou o certificado TLS (nesse caso, o Let's Encrypt, mas veremos sobre isso mais tarde), entĂŁo ele pode **verificar** que o certificado Ă© vĂĄlido.
 
-EntĂŁo, utilizando o certificado, o cliente e o Proxy de Terminação TLS decidem como encriptar o resto da comunicação TCP. Isso completa a parte do Handshake TLS.
+EntĂŁo, utilizando o certificado, o cliente e o Proxy de Terminação TLS **decidem como encriptar** o resto da **comunicação TCP**. Isso completa a parte do **Handshake TLS**.
 
-ApĂłs isso, o cliente e o servidor possuem uma conexĂŁo TCP encriptada, que Ă© provida pelo TLS. E entĂŁo eles podem usar essa conexĂŁo para começar a comunicação HTTP propriamente dita.
+ApĂłs isso, o cliente e o servidor possuem uma **conexĂŁo TCP encriptada**, que Ă© provida pelo TLS. E entĂŁo eles podem usar essa conexĂŁo para começar a **comunicação HTTP** propriamente dita.
 
-E isso resume o que Ă© HTTPS, apenas HTTP simples dentro de uma conexĂŁo TLS segura em vez de uma conexĂŁo TCP pura (nĂŁo encriptada).
+E isso resume o que Ă© **HTTPS**, apenas **HTTP** simples dentro de uma **conexĂŁo TLS segura** em vez de uma conexĂŁo TCP pura (nĂŁo encriptada).
 
 /// tip | Dica
 
-Percebe que a encriptação da comunicação acontece no nĂ­vel do TCP, nĂŁo no nĂ­vel do HTTP.
+Perceba que a encriptação da comunicação acontece no **nĂ­vel do TCP**, nĂŁo no nĂ­vel do HTTP.
 
 ///
 
 ### Solicitação HTTPS { #https-request }
 
-Agora que o cliente e servidor (especialmente o navegador e o Proxy de Terminação TLS) possuem uma conexĂŁo TCP encriptada, eles podem iniciar a comunicação HTTP.
+Agora que o cliente e servidor (especialmente o navegador e o Proxy de Terminação TLS) possuem uma **conexĂŁo TCP encriptada**, eles podem iniciar a **comunicação HTTP**.
 
-EntĂŁo, o cliente envia uma solicitação HTTPS. Que Ă© apenas uma solicitação HTTP sobre uma conexĂŁo TLS encriptada.
+EntĂŁo, o cliente envia uma **solicitação HTTPS**. Que Ă© apenas uma solicitação HTTP sobre uma conexĂŁo TLS encriptada.
 
 <img src="/img/deployment/https/https04.drawio.svg">
 
 ### Desencripte a Solicitação { #decrypt-the-request }
 
-O Proxy de Terminação TLS entĂŁo usaria a encriptação combinada para desencriptar a solicitação, e transmitiria a solicitação bĂĄsica (desencriptada) para o processo executando a aplicação (por exemplo, um processo com Uvicorn executando a aplicação FastAPI).
+O Proxy de Terminação TLS entĂŁo usaria a encriptação combinada para **desencriptar a solicitação**, e transmitiria a **solicitação HTTP bĂĄsica (desencriptada)** para o processo executando a aplicação (por exemplo, um processo com Uvicorn executando a aplicação FastAPI).
 
 <img src="/img/deployment/https/https05.drawio.svg">
 
 ### Resposta HTTP { #http-response }
 
-A aplicação processaria a solicitação e retornaria uma resposta HTTP bĂĄsica (nĂŁo encriptada) para o Proxy de Terminação TLS.
+A aplicação processaria a solicitação e retornaria uma **resposta HTTP bĂĄsica (nĂŁo encriptada)** para o Proxy de Terminação TLS.
 
 <img src="/img/deployment/https/https06.drawio.svg">
 
 ### Resposta HTTPS { #https-response }
 
-O Proxy de Terminação TLS iria encriptar a resposta utilizando a criptografia combinada anteriormente (que foi definida com o certificado para `someapp.example.com`), e devolveria para o navegador.
+O Proxy de Terminação TLS iria **encriptar a resposta** utilizando a criptografia combinada anteriormente (que foi definida com o certificado para `someapp.example.com`), e devolveria para o navegador.
 
-No prĂłximo passo, o navegador verifica que a resposta Ă© vĂĄlida e encriptada com a chave criptogrĂĄfica correta, etc. E depois desencripta a resposta e a processa.
+No prĂłximo passo, o navegador verifica que a resposta Ă© vĂĄlida e encriptada com a chave criptogrĂĄfica correta, etc. E depois **desencripta a resposta** e a processa.
 
 <img src="/img/deployment/https/https07.drawio.svg">
 
-O cliente (navegador) saberĂĄ que a resposta vem do servidor correto por que ela usa a criptografia que foi combinada entre eles usando o certificado HTTPS anterior.
+O cliente (navegador) saberĂĄ que a resposta vem do servidor correto por que ela usa a criptografia que foi combinada entre eles usando o **certificado HTTPS** anterior.
 
 ### MĂșltiplas AplicaçÔes { #multiple-applications }
 
-Podem existir mĂșltiplas aplicaçÔes em execução no mesmo servidor (ou servidores), por exemplo: outras APIs ou um banco de dados.
+Podem existir **mĂșltiplas aplicaçÔes** em execução no mesmo servidor (ou servidores), por exemplo: outras APIs ou um banco de dados.
 
-Apenas um processo pode estar vinculado a um IP e porta (o Proxy de Terminação TLS, por exemplo), mas outras aplicaçÔes/processos tambĂ©m podem estar em execução no(s) servidor(es), desde que nĂŁo tentem usar a mesma combinação de IP pĂșblico e porta.
+Apenas um processo pode estar vinculado a um IP e porta (o Proxy de Terminação TLS, por exemplo), mas outras aplicaçÔes/processos tambĂ©m podem estar em execução no(s) servidor(es), desde que nĂŁo tentem usar a mesma **combinação de IP pĂșblico e porta**.
 
 <img src="/img/deployment/https/https08.drawio.svg">
 
-Dessa forma, o Proxy de Terminação TLS pode gerenciar o HTTPS e os certificados de mĂșltiplos domĂ­nios, para mĂșltiplas aplicaçÔes, e entĂŁo transmitir as requisiçÔes para a aplicação correta em cada caso.
+Dessa forma, o Proxy de Terminação TLS pode gerenciar o HTTPS e os certificados de **mĂșltiplos domĂ­nios**, para mĂșltiplas aplicaçÔes, e entĂŁo transmitir as requisiçÔes para a aplicação correta em cada caso.
 
 ### Renovação de Certificados { #certificate-renewal }
 
-Em algum momento futuro, cada certificado irĂĄ expirar (aproximadamente 3 meses apĂłs a aquisição).
+Em algum momento futuro, cada certificado irĂĄ **expirar** (aproximadamente 3 meses apĂłs a aquisição).
 
-E entĂŁo, haverĂĄ outro programa (em alguns casos pode ser o prĂłprio Proxy de Terminação TLS) que irĂĄ interagir com o Let's Encrypt e renovar o(s) certificado(s).
+E entĂŁo, haverĂĄ outro programa (em alguns casos Ă© outro programa, em alguns casos pode ser o prĂłprio Proxy de Terminação TLS) que irĂĄ interagir com o Let's Encrypt e renovar o(s) certificado(s).
 
 <img src="/img/deployment/https/https.drawio.svg">
 
-Os certificados TLS sĂŁo associados com um nome de domĂ­nio, e nĂŁo a um endereço IP.
+Os **certificados TLS** sĂŁo **associados com um nome de domĂ­nio**, e nĂŁo a um endereço IP.
 
-EntĂŁo para renovar os certificados, o programa de renovação precisa provar para a autoridade (Let's Encrypt) que ele realmente "possui" e controla esse domĂ­nio.
+EntĂŁo para renovar os certificados, o programa de renovação precisa **provar** para a autoridade (Let's Encrypt) que ele realmente **"possui" e controla esse domĂ­nio**.
 
 Para fazer isso, e acomodar as necessidades de diferentes aplicaçÔes, existem diferentes opçÔes para esse programa. Algumas escolhas populares sĂŁo:
 
-* Modificar alguns registros DNS
+* **Modificar alguns registros DNS**.
     * Para isso, o programa de renovação precisa ter suporte Ă s APIs do provedor DNS, entĂŁo, dependendo do provedor DNS que vocĂȘ utilize, isso pode ou nĂŁo ser uma opção viĂĄvel.
-* Executar como um servidor (ao menos durante o processo de aquisição do certificado) no endereço IP pĂșblico associado com o domĂ­nio.
+* **Executar como um servidor** (ao menos durante o processo de aquisição do certificado) no endereço IP pĂșblico associado com o domĂ­nio.
     * Como dito anteriormente, apenas um processo pode estar ligado a uma porta e IP especĂ­ficos.
     * Essa Ă© uma dos motivos que fazem utilizar o mesmo Proxy de Terminação TLS para gerenciar a renovação de certificados ser tĂŁo Ăștil.
     * Caso contrĂĄrio, vocĂȘ pode ter que parar a execução do Proxy de Terminação TLS momentaneamente, inicializar o programa de renovação para adquirir os certificados, depois configurĂĄ-los com o Proxy de Terminação TLS, e entĂŁo reiniciar o Proxy de Terminação TLS. Isso nĂŁo Ă© o ideal, jĂĄ que sua(s) aplicação(Ă”es) nĂŁo vĂŁo estar disponĂ­veis enquanto o Proxy de Terminação TLS estiver desligado.
 
-Todo esse processo de renovação, enquanto o aplicativo ainda funciona, Ă© uma das principais razĂ”es para preferir um sistema separado para gerenciar HTTPS com um Proxy de Terminação TLS em vez de usar os certificados TLS no servidor da aplicação diretamente (e.g. com o Uvicorn).
+Todo esse processo de renovação, enquanto o aplicativo ainda funciona, Ă© uma das principais razĂ”es para preferir um **sistema separado para gerenciar HTTPS** com um Proxy de Terminação TLS em vez de usar os certificados TLS no servidor da aplicação diretamente (e.g. com o Uvicorn).
 
 ## Cabeçalhos encaminhados por Proxy { #proxy-forwarded-headers }
 
-Ao usar um proxy para lidar com HTTPS, seu servidor de aplicação (por exemplo, Uvicorn via FastAPI CLI) nĂŁo sabe nada sobre o processo de HTTPS; ele se comunica com HTTP simples com o Proxy de Terminação TLS.
+Ao usar um proxy para lidar com HTTPS, seu **servidor de aplicação** (por exemplo, Uvicorn via FastAPI CLI) nĂŁo sabe nada sobre o processo de HTTPS; ele se comunica com HTTP simples com o **Proxy de Terminação TLS**.
 
-Esse proxy normalmente define alguns cabeçalhos HTTP dinamicamente antes de transmitir a requisição para o servidor de aplicação, para informar ao servidor de aplicação que a requisição estĂĄ sendo encaminhada pelo proxy.
+Esse **proxy** normalmente define alguns cabeçalhos HTTP dinamicamente antes de transmitir a requisição para o **servidor de aplicação**, para informar ao servidor de aplicação que a requisição estĂĄ sendo **encaminhada** pelo proxy.
 
 /// note | Detalhes TĂ©cnicos
 
@@ -206,11 +206,11 @@ Os cabeçalhos do proxy sĂŁo:
 
 ///
 
-No entanto, como o servidor de aplicação nĂŁo sabe que estĂĄ atrĂĄs de um proxy confiĂĄvel, por padrĂŁo ele nĂŁo confiaria nesses cabeçalhos.
+No entanto, como o **servidor de aplicação** nĂŁo sabe que estĂĄ atrĂĄs de um **proxy** confiĂĄvel, por padrĂŁo ele nĂŁo confiaria nesses cabeçalhos.
 
-Mas vocĂȘ pode configurar o servidor de aplicação para confiar nos cabeçalhos encaminhados enviados pelo proxy. Se vocĂȘ estiver usando o FastAPI CLI, pode usar a opção de CLI `--forwarded-allow-ips` para dizer de quais IPs ele deve confiar nesses cabeçalhos encaminhados.
+Mas vocĂȘ pode configurar o **servidor de aplicação** para confiar nos cabeçalhos *encaminhados* enviados pelo **proxy**. Se vocĂȘ estiver usando o FastAPI CLI, pode usar a *Opção de CLI* `--forwarded-allow-ips` para dizer de quais IPs ele deve confiar nesses cabeçalhos *encaminhados*.
 
-Por exemplo, se o servidor de aplicação sĂł estiver recebendo comunicação do proxy confiĂĄvel, vocĂȘ pode defini-lo como `--forwarded-allow-ips="*"` para fazĂȘ-lo confiar em todos os IPs de entrada, jĂĄ que ele sĂł receberĂĄ requisiçÔes de seja lĂĄ qual for o IP usado pelo proxy.
+Por exemplo, se o **servidor de aplicação** sĂł estiver recebendo comunicação do **proxy** confiĂĄvel, vocĂȘ pode defini-lo como `--forwarded-allow-ips="*"` para fazĂȘ-lo confiar em todos os IPs de entrada, jĂĄ que ele sĂł receberĂĄ requisiçÔes de seja lĂĄ qual for o IP usado pelo **proxy**.
 
 Dessa forma, a aplicação seria capaz de saber qual Ă© sua prĂłpria URL pĂșblica, se estĂĄ usando HTTPS, o domĂ­nio, etc.
 
@@ -224,8 +224,8 @@ VocĂȘ pode saber mais sobre isso na documentação em [AtrĂĄs de um Proxy - Habi
 
 ## Recapitulando { #recap }
 
-Possuir HTTPS habilitado na sua aplicação Ă© bastante importante, e atĂ© crĂ­tico na maioria dos casos. A maior parte do esforço que vocĂȘ tem que colocar sobre o HTTPS como desenvolvedor estĂĄ em entender esses conceitos e como eles funcionam.
+Possuir **HTTPS** habilitado na sua aplicação Ă© bastante importante, e atĂ© **crĂ­tico** na maioria dos casos. A maior parte do esforço que vocĂȘ tem que colocar sobre o HTTPS como desenvolvedor estĂĄ em **entender esses conceitos** e como eles funcionam.
 
-Mas uma vez que vocĂȘ saiba o bĂĄsico de HTTPS para desenvolvedores, vocĂȘ pode combinar e configurar diferentes ferramentas facilmente para gerenciar tudo de uma forma simples.
+Mas uma vez que vocĂȘ saiba o bĂĄsico de **HTTPS para desenvolvedores**, vocĂȘ pode combinar e configurar diferentes ferramentas facilmente para gerenciar tudo de uma forma simples.
 
-Em alguns dos prĂłximos capĂ­tulos, eu mostrarei para vocĂȘ vĂĄrios exemplos concretos de como configurar o HTTPS para aplicaçÔes FastAPI. đŸ”’
+Em alguns dos prĂłximos capĂ­tulos, eu mostrarei para vocĂȘ vĂĄrios exemplos concretos de como configurar o **HTTPS** para aplicaçÔes **FastAPI**. đŸ”’
index 8f34e37d05f00caede4cbd14c3f0239e1bfaeff5..0c8db162e3a8bdcc20ba847c077e0861862651ec 100644 (file)
@@ -53,7 +53,7 @@ A principal coisa que vocĂȘ precisa para executar uma aplicação **FastAPI** (o
 Existem diversas alternativas, incluindo:
 
 * [Uvicorn](https://www.uvicorn.dev/): um servidor ASGI de alta performance.
-* [Hypercorn](https://hypercorn.readthedocs.io/): um servidor ASGI compatĂ­vel com HTTP/2, Trio e outros recursos.
+* [Hypercorn](https://hypercorn.readthedocs.io/): um servidor ASGI compatĂ­vel com HTTP/2, Trio e outras funcionalidades.
 * [Daphne](https://github.com/django/daphne): servidor ASGI construĂ­do para Django Channels.
 * [Granian](https://github.com/emmett-framework/granian): um servidor HTTP Rust para aplicaçÔes Python.
 
@@ -136,7 +136,7 @@ Uvicorn e outros servidores suportam a opção `--reload` que Ă© Ăștil durante o
 
 A opção `--reload` consome muito mais recursos, Ă© mais instĂĄvel, etc.
 
-Ela ajuda muito durante o **desenvolvimento**, mas vocĂȘ **nĂŁo deve** usĂĄ-la em **produção**.
+Ela ajuda muito durante o **desenvolvimento**, mas vocĂȘ **nĂŁo deveria** usĂĄ-la em **produção**.
 
 ///
 
index 7eedd3908e2fbc819669c473a2dc35b9b3ad0a29..de02c5d7ca17cf583cc8ccd283c3e1386fde5a7e 100644 (file)
@@ -1,6 +1,6 @@
 # Suporte a Editores { #editor-support }
 
-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.
+A [FastAPI Extension](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) oficial melhora seu fluxo de trabalho de desenvolvimento FastAPI 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.
 
 Para mais detalhes sobre a extensĂŁo, consulte o README no [repositĂłrio do GitHub](https://github.com/fastapi/fastapi-vscode).
 
index a464beceebfc364590a3ebe89dc4e52de9d5959e..ebf037faaff09a0dd0db4121d888ffc44f2dbe93 100644 (file)
@@ -289,7 +289,7 @@ Essas informaçÔes serĂŁo Ășteis ao aprender sobre [Ambientes Virtuais](virtual
 
 ## ConclusĂŁo { #conclusion }
 
-Com isso, vocĂȘ deve ter uma compreensĂŁo bĂĄsica do que sĂŁo **variĂĄveis â€‹â€‹de ambiente** e como usĂĄ-las em Python.
+Com isso, vocĂȘ deveria ter uma compreensĂŁo bĂĄsica do que sĂŁo **variĂĄveis â€‹â€‹de ambiente** e como usĂĄ-las em Python.
 
 VocĂȘ tambĂ©m pode ler mais sobre elas na [Wikipedia para VariĂĄveis â€‹â€‹de Ambiente](https://en.wikipedia.org/wiki/Environment_variable).
 
index 8b14c5fea62cbff55cfa12eefbe1959cfdbe68c8..846bc7f94710c042f261f5c07fbcfa3c16c2d65f 100644 (file)
@@ -1,15 +1,15 @@
-# Recursos { #features }
+# Funcionalidades { #features }
 
-## Recursos do FastAPI { #fastapi-features }
+## Funcionalidades do FastAPI { #fastapi-features }
 
 **FastAPI** te oferece o seguinte:
 
 ### Baseado em padrĂ”es abertos { #based-on-open-standards }
 
-* [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification) para criação de APIs, incluindo declaraçÔes de <dfn title="tambĂ©m conhecido como: endpoints, rotas">caminho</dfn> <dfn title="tambĂ©m conhecido como mĂ©todos HTTP, como POST, GET, PUT, DELETE">operaçÔes</dfn>, parĂąmetros, requisiçÔes de corpo, segurança etc.
+* [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification) para criação de APIs, incluindo declaraçÔes de <dfn title="tambĂ©m conhecido como: endpoints, rotas">path</dfn> <dfn title="tambĂ©m conhecido como mĂ©todos HTTP, como POST, GET, PUT, DELETE">operaçÔes</dfn>, parĂąmetros, corpos de requisição, segurança etc.
 * Documentação automĂĄtica de modelos de dados com [**JSON Schema**](https://json-schema.org/) (jĂĄ que o OpenAPI em si Ă© baseado no JSON Schema).
 * Projetado em torno desses padrĂ”es, apĂłs um estudo meticuloso. Em vez de uma camada improvisada por cima.
-* Isso tambĂ©m permite o uso de **geração de cĂłdigo do cliente** automaticamente em muitas linguagens.
+* Isso tambĂ©m permite o uso de **geração de cĂłdigo de cliente** automaticamente em muitas linguagens.
 
 ### Documentação automĂĄtica { #automatic-docs }
 
@@ -75,7 +75,7 @@ Passe as chaves e valores do dicionĂĄrio `second_user_data` diretamente como arg
 
 Todo o framework foi projetado para ser fĂĄcil e intuitivo de usar, todas as decisĂ”es foram testadas em vĂĄrios editores antes do inĂ­cio do desenvolvimento, para garantir a melhor experiĂȘncia de desenvolvimento.
 
-Na pesquisa de desenvolvedores Python, ficou claro [que um dos recursos mais utilizados Ă© o "preenchimento automĂĄtico"](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features).
+Nas pesquisas de desenvolvedores Python, ficou claro [que uma das funcionalidades mais utilizadas Ă© o "preenchimento automĂĄtico"](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features).
 
 Todo o framework **FastAPI** Ă© feito para satisfazer isso. O preenchimento automĂĄtico funciona em todos os lugares.
 
@@ -97,9 +97,9 @@ Sem a necessidade de digitar nomes de chaves erroneamente, ir e voltar entre doc
 
 ### Breve { #short }
 
-HĂĄ **padrĂ”es** sensĂ­veis para tudo, com configuraçÔes adicionais em todos os lugares. Todos os parĂąmetros podem ser regulados para fazer o que vocĂȘ precisa e para definir a API que vocĂȘ necessita.
+HĂĄ **valores padrĂŁo** sensĂ­veis para tudo, com configuraçÔes adicionais em todos os lugares. Todos os parĂąmetros podem ser regulados para fazer o que vocĂȘ precisa e para definir a API que vocĂȘ necessita.
 
-Por padrĂŁo, tudo **"simplesmente funciona"**.
+Mas, por padrĂŁo, tudo **"simplesmente funciona"**.
 
 ### Validação { #validation }
 
@@ -121,7 +121,7 @@ Toda a validação Ă© controlada pelo robusto e bem estabelecido **Pydantic**.
 
 Segurança e autenticação integradas. Sem nenhum compromisso com bancos de dados ou modelos de dados.
 
-Todos os esquemas de seguranças definidos no OpenAPI, incluindo:
+Todos os esquemas de segurança definidos no OpenAPI, incluindo:
 
 * HTTP Basic.
 * **OAuth2** (tambĂ©m com **tokens JWT**). Confira o tutorial em [OAuth2 com JWT](tutorial/security/oauth2-jwt.md).
@@ -130,9 +130,9 @@ Todos os esquemas de seguranças definidos no OpenAPI, incluindo:
     * parĂąmetros da Query.
     * Cookies etc.
 
-AlĂ©m disso, todos os recursos de segurança do Starlette (incluindo **cookies de sessĂŁo**).
+AlĂ©m disso, todas as funcionalidades de segurança do Starlette (incluindo **cookies de sessĂŁo**).
 
-Tudo construĂ­do como ferramentas e componentes reutilizĂĄveis que sĂŁo fĂĄceis de integrar com seus sistemas, armazenamento de dados, banco de dados relacionais e nĂŁo-relacionais etc.
+Tudo construĂ­do como ferramentas e componentes reutilizĂĄveis que sĂŁo fĂĄceis de integrar com seus sistemas, armazenamentos de dados, bancos de dados relacionais e NoSQL etc.
 
 ### Injeção de dependĂȘncia { #dependency-injection }
 
@@ -142,40 +142,40 @@ FastAPI inclui um sistema de <dfn title='tambĂ©m conhecido como "componentes", "
 * Tudo **automaticamente controlado** pelo framework.
 * Todas as dependĂȘncias podem pedir dados das requisiçÔes e **ampliar** as restriçÔes e documentação automĂĄtica da **operação de rota**.
 * **Validação automĂĄtica** mesmo para parĂąmetros da *operação de rota* definidos em dependĂȘncias.
-* Suporte para sistemas de autenticação complexos, **conexĂ”es com banco de dados** etc.
+* Suporte para sistemas complexos de autenticação de usuĂĄrios, **conexĂ”es com banco de dados** etc.
 * **Sem comprometer** os bancos de dados, frontends etc. Mas fĂĄcil integração com todos eles.
 
 ### "Plug-ins" ilimitados { #unlimited-plug-ins }
 
 Ou, de outra forma, sem a necessidade deles, importe e use o cĂłdigo que precisar.
 
-Qualquer integração Ă© projetada para ser tĂŁo simples de usar (com dependĂȘncias) que vocĂȘ pode criar um "plug-in" para suas aplicaçÔes com 2 linhas de cĂłdigo usando a mesma estrutura e sintaxe para as suas *operaçÔes de rota*.
+Qualquer integração Ă© projetada para ser tĂŁo simples de usar (com dependĂȘncias) que vocĂȘ pode criar um "plug-in" para sua aplicação com 2 linhas de cĂłdigo usando a mesma estrutura e sintaxe usadas para as suas *operaçÔes de rota*.
 
 ### Testado { #tested }
 
 * 100% <dfn title="A quantidade de cĂłdigo que Ă© testada automaticamente">de cobertura de testes</dfn>.
-* 100% do cĂłdigo com <dfn title="AnotaçÔes de tipo do Python, com isso seu editor e ferramentas externas podem te dar um suporte melhor">anotaçÔes de tipo</dfn>.
+* Base de cĂłdigo 100% <dfn title="AnotaçÔes de tipo do Python, com isso seu editor e ferramentas externas podem te dar um suporte melhor">anotada com tipos</dfn>.
 * Usado para aplicaçÔes em produção.
 
-## Recursos do Starlette { #starlette-features }
+## Funcionalidades do Starlette { #starlette-features }
 
 **FastAPI** Ă© totalmente compatĂ­vel com (e baseado no) [**Starlette**](https://www.starlette.dev/). EntĂŁo, qualquer cĂłdigo adicional Starlette que vocĂȘ tiver, tambĂ©m funcionarĂĄ.
 
 `FastAPI` Ă© na verdade uma sub-classe do `Starlette`. EntĂŁo, se vocĂȘ jĂĄ conhece ou usa Starlette, a maioria das funcionalidades se comportarĂĄ da mesma forma.
 
-Com **FastAPI**, vocĂȘ terĂĄ todos os recursos do **Starlette** (jĂĄ que FastAPI Ă© apenas um Starlette com esterĂłides):
+Com **FastAPI**, vocĂȘ terĂĄ todas as funcionalidades do **Starlette** (jĂĄ que FastAPI Ă© apenas um Starlette com esteroides):
 
 * Desempenho realmente impressionante. Ă‰ [um dos frameworks Python disponĂ­veis mais rĂĄpidos, a par com o **NodeJS** e **Go**](https://github.com/encode/starlette#performance).
 * Suporte a **WebSocket**.
 * Tarefas em processo background.
-* Eventos na inicialização e encerramento.
+* Eventos de inicialização e encerramento.
 * Cliente de testes construĂ­do sobre HTTPX.
-* Respostas em **CORS**, GZip, Static Files, Streaming.
+* Respostas **CORS**, GZip, Static Files, Streaming.
 * Suporte a **Session e Cookie**.
 * 100% de cobertura de testes.
-* 100% do cĂłdigo utilizando anotaçÔes de tipo.
+* Base de cĂłdigo 100% com anotaçÔes de tipo.
 
-## Recursos do Pydantic { #pydantic-features }
+## Funcionalidades do Pydantic { #pydantic-features }
 
 **FastAPI** Ă© totalmente compatĂ­vel com (e baseado no) [**Pydantic**](https://docs.pydantic.dev/). EntĂŁo, qualquer cĂłdigo Pydantic adicional que vocĂȘ tiver, tambĂ©m funcionarĂĄ.
 
@@ -185,7 +185,7 @@ Isso tambĂ©m significa que em muitos casos vocĂȘ poderĂĄ passar o mesmo objeto q
 
 O mesmo se aplica no sentido inverso, em muitos casos vocĂȘ poderĂĄ simplesmente passar o objeto que vocĂȘ recebeu do banco de dados **diretamente para o cliente**.
 
-Com **FastAPI** vocĂȘ terĂĄ todos os recursos do **Pydantic** (jĂĄ que FastAPI utiliza o Pydantic para todo o controle dos dados):
+Com **FastAPI** vocĂȘ terĂĄ todas as funcionalidades do **Pydantic** (jĂĄ que FastAPI utiliza o Pydantic para todo o controle dos dados):
 
 * **Sem pegadinhas**:
     * Sem novas definiçÔes de esquema de micro-linguagem para aprender.
index 49a7bb5936801f766b60c03aa506e7fd3284aab0..0091d4cebd1bc6a6f0fd590814f3a397547da114 100644 (file)
@@ -30,7 +30,7 @@ Ao adicionar uma estrela, outras pessoas conseguirĂŁo encontrĂĄ-lo com mais faci
 
 ## Acompanhe o repositĂłrio no GitHub para lançamentos { #watch-the-github-repository-for-releases }
 
-VocĂȘ pode â€œacompanhar” (watch) o FastAPI no GitHub (clicando no botĂŁo â€œwatch” no canto superior direito): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). đŸ‘€
+VocĂȘ pode â€œacompanhar” o FastAPI no GitHub (clicando no botĂŁo â€œwatch” no canto superior direito): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). đŸ‘€
 
 LĂĄ vocĂȘ pode selecionar â€œApenas lançamentos”.
 
index d47d5796346bc34c3cd9c0e2d756ad0a7a295747..bc54ae76a5243fe87244a30dd73f9cbb144b1955 100644 (file)
@@ -1,5 +1,6 @@
 # Configure a UI do Swagger { #configure-swagger-ui }
 
+
 VocĂȘ pode configurar alguns [parĂąmetros extras da UI do Swagger](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/).
 
 Para configurĂĄ-los, passe o argumento `swagger_ui_parameters` ao criar o objeto da aplicação `FastAPI()` ou para a função `get_swagger_ui_html()`.
index 5603535320891d813e74dbc64a84e9301d4127d9..070e63576eca619fc3c017dbb4e47f2107decb9b 100644 (file)
@@ -10,7 +10,7 @@ Por exemplo, se vocĂȘ quiser ler ou manipular o corpo da requisição antes que
 
 Isso Ă© um recurso "avançado".
 
-Se vocĂȘ for um iniciante em **FastAPI** vocĂȘ deve considerar pular essa seção.
+Se vocĂȘ estĂĄ apenas começando com **FastAPI**, talvez queira pular esta seção.
 
 ///
 
@@ -40,7 +40,7 @@ Primeiro, criamos uma classe `GzipRequest`, que irĂĄ sobrescrever o mĂ©todo `Req
 
 Se nĂŁo houver `gzip` no cabeçalho, ele nĂŁo tentarĂĄ descomprimir o corpo.
 
-Dessa forma, a mesma classe de rota pode lidar com requisiçÔes comprimidas ou nĂŁo comprimidas.
+Dessa forma, a mesma classe de rota pode lidar com requisiçÔes comprimidas com gzip ou nĂŁo comprimidas.
 
 {* ../../docs_src/custom_request_and_route/tutorial001_an_py310.py hl[9:16] *}
 
@@ -84,7 +84,7 @@ Mas por causa das nossas mudanças em `GzipRequest.body`, o corpo da requisiçã
 
 Para resolver esse mesmo problema, Ă© provavelmente muito mais fĂĄcil usar o `body` em um manipulador personalizado para `RequestValidationError` ([Tratando Erros](../tutorial/handling-errors.md#use-the-requestvalidationerror-body)).
 
-Mas esse exemplo ainda Ă© valido e mostra como interagir com os componentes internos.
+Mas esse exemplo ainda Ă© vĂĄlido e mostra como interagir com os componentes internos.
 
 ///
 
index f96a202f0823fe97fc3716c5c28909299cff16e6..081c3cf729bafd2c1f747ec5015dbf8b4bcda91a 100644 (file)
@@ -1,5 +1,6 @@
 # GraphQL { #graphql }
 
+
 Como o **FastAPI** Ă© baseado no padrĂŁo **ASGI**, Ă© muito fĂĄcil integrar qualquer biblioteca **GraphQL** tambĂ©m compatĂ­vel com ASGI.
 
 VocĂȘ pode combinar *operaçÔes de rota* normais do FastAPI com GraphQL na mesma aplicação.
index 1352abda944edebfaf88f5c9c8a03fd5635f3786..e03deb449915def502272869bc9f1b05e8152a2b 100644 (file)
@@ -8,6 +8,8 @@ O FastAPI versĂŁo 0.119.0 introduziu suporte parcial ao Pydantic v1 a partir de
 
 O FastAPI 0.126.0 removeu o suporte ao Pydantic v1, enquanto ainda oferece suporte a `pydantic.v1` por mais algum tempo.
 
+O FastAPI 0.128.0 tambĂ©m removeu o suporte a `pydantic.v1`, entĂŁo as versĂ”es mais recentes do FastAPI exigem o Pydantic v2.
+
 /// warning | Atenção
 
 A equipe do Pydantic interrompeu o suporte ao Pydantic v1 para as versĂ”es mais recentes do Python, a partir do **Python 3.14**.
@@ -54,6 +56,16 @@ Isso significa que vocĂȘ pode instalar a versĂŁo mais recente do Pydantic v2 e i
 
 ### Suporte do FastAPI ao Pydantic v1 no v2 { #fastapi-support-for-pydantic-v1-in-v2 }
 
+/// warning | Atenção
+
+Este suporte do FastAPI para modelos `pydantic.v1` foi adicionado no **FastAPI 0.119.0** e removido no **FastAPI 0.128.0**. Ele foi pensado como uma ajuda temporĂĄria para a migração para o Pydantic v2.
+
+Nas versĂ”es atuais do FastAPI, usar um modelo `pydantic.v1` na sua aplicação gerarĂĄ um erro.
+
+O restante desta seção descreve o suporte temporĂĄrio disponĂ­vel apenas nessas versĂ”es antigas.
+
+///
+
 Desde o FastAPI 0.119.0, hĂĄ tambĂ©m suporte parcial ao Pydantic v1 a partir de dentro do Pydantic v2, para facilitar a migração para o v2.
 
 Assim, vocĂȘ pode atualizar o Pydantic para a versĂŁo 2 mais recente e alterar os imports para usar o submĂłdulo `pydantic.v1`, e em muitos casos tudo simplesmente funcionarĂĄ.
@@ -122,6 +134,12 @@ Se vocĂȘ precisar usar algumas das ferramentas especĂ­ficas do FastAPI para par
 
 ### Migre em etapas { #migrate-in-steps }
 
+/// warning | Atenção
+
+A migração gradual usando modelos Pydantic v1 e v2 na mesma aplicação descrita abaixo sĂł funciona do **FastAPI 0.119.0 ao 0.127.x**. Ela foi removida no **FastAPI 0.128.0**, e as versĂ”es mais recentes exigem modelos **Pydantic v2**.
+
+///
+
 /// tip | Dica
 
 Primeiro tente com o `bump-pydantic`, se seus testes passarem e isso funcionar, entĂŁo vocĂȘ concluiu tudo com um Ășnico comando. âœš
index 3fe9ea7193e16405c131d50047b7d0e7d3cf0d56..5b1bcb1e050b4b2ec006f025da35311f077aa4fb 100644 (file)
@@ -1,5 +1,6 @@
 # Esquemas OpenAPI Separados para Entrada e SaĂ­da ou NĂŁo { #separate-openapi-schemas-for-input-and-output-or-not }
 
+
 Desde que o **Pydantic v2** foi lançado, o OpenAPI gerado Ă© um pouco mais exato e **correto** do que antes. đŸ˜Ž
 
 De fato, em alguns casos, ele terĂĄ atĂ© **dois JSON Schemas** no OpenAPI para o mesmo modelo Pydantic, para entrada e saĂ­da, dependendo se eles possuem **valores padrĂŁo**.
index 2f12317c3315186ca8e24b2b2eba50a593bc8fd3..fbd93edbc98f44fe2b2ce7825d12550dc0dd0272 100644 (file)
@@ -38,7 +38,7 @@ include_yaml:
 
 ---
 
-FastAPI Ă© um framework web moderno e rĂĄpido (alta performance) para construção de APIs com Python, baseado nos type hints padrĂ”es do Python.
+FastAPI Ă© um framework web moderno e rĂĄpido (alta performance) para construção de APIs com Python, baseado nas anotaçÔes de tipo padrĂŁo do Python.
 
 Os recursos chave sĂŁo:
 
@@ -46,7 +46,7 @@ Os recursos chave sĂŁo:
 * **RĂĄpido para codar**: Aumenta a velocidade para desenvolver recursos entre 200% a 300%. *
 * **Poucos bugs**: Reduz cerca de 40% de erros induzidos por humanos (desenvolvedores). *
 * **Intuitivo**: Grande suporte a editores. <dfn title="tambĂ©m conhecido como: autocompletar, preenchimento automĂĄtico, IntelliSense">Completação</dfn> em todos os lugares. Menos tempo debugando.
-* **FĂĄcil**: Projetado para ser fĂĄcil de aprender e usar. Menos tempo lendo docs.
+* **FĂĄcil**: Projetado para ser fĂĄcil de aprender e usar. Menos tempo lendo documentação.
 * **Enxuto**: Minimize duplicação de cĂłdigo. MĂșltiplas funcionalidades para cada declaração de parĂąmetro. Menos bugs.
 * **Robusto**: Tenha cĂłdigo pronto para produção. E com documentação interativa automĂĄtica.
 * **Baseado em padrĂ”es**: Baseado em (e totalmente compatĂ­vel com) os padrĂ”es abertos para APIs: [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (anteriormente conhecido como Swagger) e [JSON Schema](https://json-schema.org/).
@@ -239,7 +239,7 @@ async def read_item(item_id: int, q: str | None = None):
 
 **Nota**:
 
-Se vocĂȘ nĂŁo sabe, verifique a seção _"Com pressa?"_ sobre [`async` e `await` nas docs](https://fastapi.tiangolo.com/pt/async/#in-a-hurry).
+Se vocĂȘ nĂŁo sabe, verifique a seção _"Com pressa?"_ sobre [`async` e `await` na documentação](https://fastapi.tiangolo.com/pt/async/#in-a-hurry).
 
 </details>
 
index 8a34071a655ad02e5a6442c9dce8a592be9807d6..967f1f5fb385a23ef9efa66ea94043977f14b64a 100644 (file)
@@ -1,23 +1,23 @@
 # Full Stack FastAPI Template { #full-stack-fastapi-template }
 
-_Templates_, embora tipicamente venham com alguma configuração especĂ­fica, sĂŁo desenhados para serem flexĂ­veis e customizĂĄveis. Isso permite que vocĂȘ os modifique e adapte para as especificaçÔes do seu projeto, fazendo-os um excelente ponto de partida. đŸ
+Templates, embora tipicamente venham com alguma configuração especĂ­fica, sĂŁo desenhados para serem flexĂ­veis e customizĂĄveis. Isso permite que vocĂȘ os modifique e adapte para as especificaçÔes do seu projeto, fazendo-os um excelente ponto de partida. đŸ
 
-VocĂȘ pode usar esse _template_ para começar, jĂĄ que ele inclui vĂĄrias configuraçÔes iniciais, segurança, banco de dados, e alguns _endpoints_ de API jĂĄ feitos para vocĂȘ.
+VocĂȘ pode usar esse template para começar, jĂĄ que ele inclui vĂĄrias configuraçÔes iniciais, segurança, banco de dados e alguns endpoints de API jĂĄ feitos para vocĂȘ.
 
 RepositĂłrio GitHub: [Full Stack FastAPI Template](https://github.com/tiangolo/full-stack-fastapi-template)
 
 ## Full Stack FastAPI Template - Pilha de Tecnologias e Recursos { #full-stack-fastapi-template-technology-stack-and-features }
 
 - âšĄ [**FastAPI**](https://fastapi.tiangolo.com/pt) para a API do backend em Python.
-    - đŸ§° [SQLModel](https://sqlmodel.tiangolo.com) para as interaçÔes do Python com bancos de dados SQL (ORM).
-    - đŸ” [Pydantic](https://docs.pydantic.dev), usado pelo FastAPI, para validação de dados e gerenciamento de configuraçÔes.
-    - đŸ’Ÿ [PostgreSQL](https://www.postgresql.org) como banco de dados SQL.
+  - đŸ§° [SQLModel](https://sqlmodel.tiangolo.com) para as interaçÔes do Python com bancos de dados SQL (ORM).
+  - đŸ” [Pydantic](https://docs.pydantic.dev), usado pelo FastAPI, para validação de dados e gerenciamento de configuraçÔes.
+  - đŸ’Ÿ [PostgreSQL](https://www.postgresql.org) como banco de dados SQL.
 - đŸš€ [React](https://react.dev) para o frontend.
-    - đŸ’ƒ Usando TypeScript, hooks, Vite, e outras partes de uma _stack_ frontend moderna.
-    - đŸŽš [Tailwind CSS](https://tailwindcss.com) e [shadcn/ui](https://ui.shadcn.com) para os componentes de frontend.
-    - đŸ€– Um cliente frontend automaticamente gerado.
-    - đŸ§Ș [Playwright](https://playwright.dev) para testes Ponta-a-Ponta.
-    - đŸŠ‡ Suporte para modo escuro.
+  - đŸ’ƒ Usando TypeScript, hooks, Vite, e outras partes de uma stack frontend moderna.
+  - đŸŽš [Tailwind CSS](https://tailwindcss.com) e [shadcn/ui](https://ui.shadcn.com) para os componentes de frontend.
+  - đŸ€– Um cliente frontend automaticamente gerado.
+  - đŸ§Ș [Playwright](https://playwright.dev) para testes Ponta-a-Ponta.
+  - đŸŠ‡ Suporte para modo escuro.
 - đŸ‹ [Docker Compose](https://www.docker.com) para desenvolvimento e produção.
 - đŸ”’ Hash seguro de senhas por padrĂŁo.
 - đŸ”‘ Autenticação JWT (JSON Web Token).
@@ -25,4 +25,4 @@ RepositĂłrio GitHub: [Full Stack FastAPI Template](https://github.com/tiangolo/f
 - âœ… Testes com [Pytest](https://pytest.org).
 - đŸ“ž [Traefik](https://traefik.io) como proxy reverso / balanceador de carga.
 - đŸšą InstruçÔes de deployment usando Docker Compose, incluindo como configurar um proxy frontend com Traefik para gerenciar automaticamente certificados HTTPS.
-- đŸ­ CI (Integração ContĂ­nua) e CD (_Deploy_ ContĂ­nuo) baseado em GitHub Actions.
+- đŸ­ CI (integração contĂ­nua) e CD (deployment contĂ­nuo) baseados em GitHub Actions.
index 7a6bf26929234ff67f8d1bf68634108339dcf388..d4ba537781f8fae20520ccf1230da782094d3aaa 100644 (file)
@@ -1,20 +1,20 @@
 # Introdução aos tipos Python { #python-types-intro }
 
-O Python possui suporte para "type hints" opcionais (tambĂ©m chamados de "type annotations").
+O Python possui suporte para "anotaçÔes de tipo" opcionais (tambĂ©m chamadas de "type annotations").
 
-Esses **"type hints"** ou anotaçÔes sĂŁo uma sintaxe especial que permite declarar o <dfn title="por exemplo: str, int, float, bool">tipo</dfn> de uma variĂĄvel.
+Essas **"anotaçÔes de tipo"** ou anotaçÔes sĂŁo uma sintaxe especial que permite declarar o <dfn title="por exemplo: str, int, float, bool">tipo</dfn> de uma variĂĄvel.
 
 Ao declarar tipos para suas variĂĄveis, editores e ferramentas podem oferecer um melhor suporte.
 
-Este Ă© apenas um **tutorial rĂĄpido / atualização** sobre type hints do Python. Ele cobre apenas o mĂ­nimo necessĂĄrio para usĂĄ-los com o **FastAPI**... que Ă© realmente muito pouco.
+Este Ă© apenas um **tutorial rĂĄpido / atualização** sobre anotaçÔes de tipo do Python. Ele cobre apenas o mĂ­nimo necessĂĄrio para usĂĄ-las com o **FastAPI**... que Ă© realmente muito pouco.
 
-O **FastAPI** Ă© todo baseado nesses type hints, eles oferecem muitas vantagens e benefĂ­cios.
+O **FastAPI** Ă© todo baseado nessas anotaçÔes de tipo, elas oferecem muitas vantagens e benefĂ­cios.
 
-Mas mesmo que vocĂȘ nunca use o **FastAPI**, vocĂȘ se beneficiaria de aprender um pouco sobre eles.
+Mas mesmo que vocĂȘ nunca use o **FastAPI**, vocĂȘ se beneficiaria de aprender um pouco sobre elas.
 
 /// note | Nota
 
-Se vocĂȘ Ă© um especialista em Python e jĂĄ sabe tudo sobre type hints, pule para o prĂłximo capĂ­tulo.
+Se vocĂȘ Ă© um especialista em Python e jĂĄ sabe tudo sobre anotaçÔes de tipo, pule para o prĂłximo capĂ­tulo.
 
 ///
 
@@ -34,7 +34,7 @@ A função faz o seguinte:
 
 * Pega um `first_name` e `last_name`.
 * Converte a primeira letra de cada uma em maiĂșsculas com `title()`.
-* <dfn title="Coloca-os juntos, como um sĂł. Com o conteĂșdo de um apĂłs o outro.">Concatena</dfn> com um espaço no meio.
+* <dfn title="Coloca-os juntos, como um sĂł. Com o conteĂșdo de um apĂłs o outro.">Concatena</dfn>-os com um espaço no meio.
 
 {* ../../docs_src/python_types/tutorial001_py310.py hl[2] *}
 
@@ -44,15 +44,15 @@ A função faz o seguinte:
 
 Mas agora imagine que vocĂȘ estava escrevendo do zero.
 
-Em algum momento vocĂȘ teria iniciado a definição da função, jĂĄ tinha os parĂąmetros prontos...
+Em algum momento vocĂȘ começa a definir a função, e jĂĄ tem os parĂąmetros prontos...
 
-Mas entĂŁo vocĂȘ deve chamar "esse mĂ©todo que converte a primeira letra em maiĂșscula".
+Mas entĂŁo vocĂȘ tem que chamar "esse mĂ©todo que converte a primeira letra em maiĂșscula".
 
 Era `upper`? Era `uppercase`? `first_uppercase`? `capitalize`?
 
-Em seguida, tente com o velho amigo do programador, o preenchimento automĂĄtico do editor.
+EntĂŁo, vocĂȘ tenta com o velho amigo do programador, o preenchimento automĂĄtico do editor.
 
-VocĂȘ digita o primeiro parĂąmetro da função, `first_name`, depois um ponto (`.`) e, em seguida, pressiona `Ctrl+Space` para acionar o preenchimento automĂĄtico.
+VocĂȘ digita o primeiro parĂąmetro da função, `first_name`, depois um ponto (`.`) e, em seguida, pressiona `Ctrl+Space` para acionar o preenchimento.
 
 Mas, infelizmente, vocĂȘ nĂŁo obtĂ©m nada Ăștil:
 
@@ -76,7 +76,7 @@ para:
 
 Ă‰ isso aĂ­.
 
-Esses sĂŁo os "type hints":
+Essas sĂŁo as "anotaçÔes de tipo":
 
 {* ../../docs_src/python_types/tutorial002_py310.py hl[1] *}
 
@@ -90,11 +90,11 @@ Isso nĂŁo Ă© o mesmo que declarar valores padrĂŁo como seria com:
 
 Estamos usando dois pontos (`:`), nĂŁo sinal de igual (`=`).
 
-E adicionar type hints normalmente nĂŁo muda o que acontece do que aconteceria sem eles.
+E adicionar anotaçÔes de tipo normalmente nĂŁo muda o que acontece do que aconteceria sem elas.
 
-Mas agora, imagine que vocĂȘ estĂĄ novamente no meio da criação dessa função, mas com type hints.
+Mas agora, imagine que vocĂȘ estĂĄ novamente no meio da criação dessa função, mas com anotaçÔes de tipo.
 
-No mesmo ponto, vocĂȘ tenta acionar o preenchimento automĂĄtico com o `Ctrl+Space` e vĂȘ:
+No mesmo ponto, vocĂȘ tenta acionar o autocompletar com `Ctrl+Space` e vĂȘ:
 
 <img src="/img/python-types/image02.png">
 
@@ -104,11 +104,11 @@ Com isso, vocĂȘ pode rolar, vendo as opçÔes, atĂ© encontrar o que "soa familia
 
 ## Mais motivação { #more-motivation }
 
-Verifique esta função, ela jĂĄ possui type hints:
+Verifique esta função, ela jĂĄ possui anotaçÔes de tipo:
 
 {* ../../docs_src/python_types/tutorial003_py310.py hl[1] *}
 
-Como o editor conhece os tipos das variĂĄveis, vocĂȘ nĂŁo obtĂ©m apenas o preenchimento automĂĄtico, mas tambĂ©m as verificaçÔes de erro:
+Como o editor conhece os tipos das variĂĄveis, vocĂȘ nĂŁo obtĂ©m apenas o preenchimento, mas tambĂ©m as verificaçÔes de erro:
 
 <img src="/img/python-types/image04.png">
 
@@ -118,9 +118,9 @@ Agora vocĂȘ sabe que precisa corrigi-la, convertendo `age` em uma string com `st
 
 ## Declarando tipos { #declaring-types }
 
-VocĂȘ acabou de ver o local principal para declarar type hints. Como parĂąmetros de função.
+VocĂȘ acabou de ver o local principal para declarar anotaçÔes de tipo. Como parĂąmetros de função.
 
-Este tambĂ©m Ă© o principal local em que vocĂȘ os usaria com o **FastAPI**.
+Este tambĂ©m Ă© o principal local em que vocĂȘ as usaria com o **FastAPI**.
 
 ### Tipos simples { #simple-types }
 
@@ -137,7 +137,7 @@ VocĂȘ pode usar, por exemplo:
 
 ### MĂłdulo `typing` { #typing-module }
 
-Para alguns casos adicionais, vocĂȘ pode precisar importar alguns itens do mĂłdulo padrĂŁo `typing`, por exemplo, quando quiser declarar que algo pode ter "qualquer tipo", vocĂȘ pode usar `Any` de `typing`:
+Para alguns casos de uso adicionais, vocĂȘ pode precisar importar alguns itens do mĂłdulo padrĂŁo `typing`, por exemplo, quando quiser declarar que algo pode ter "qualquer tipo", vocĂȘ pode usar `Any` de `typing`:
 
 ```python
 from typing import Any
@@ -149,11 +149,11 @@ def some_function(data: Any):
 
 ### Tipos genĂ©ricos { #generic-types }
 
-Alguns tipos podem receber "parĂąmetros de tipo" entre colchetes, para definir seus tipos internos, por exemplo, uma "lista de strings" seria declarada como `list[str]`.
+Alguns tipos podem receber "parĂąmetros de tipo" entre colchetes, para definir seus tipos internos, por exemplo, uma "list de strings" seria declarada como `list[str]`.
 
 Esses tipos que podem receber parĂąmetros de tipo sĂŁo chamados **tipos genĂ©ricos** ou **genĂ©ricos**.
 
-VocĂȘ pode usar os mesmos tipos internos como genĂ©ricos (com colchetes e tipos dentro):
+VocĂȘ pode usar os mesmos tipos embutidos como genĂ©ricos (com colchetes e tipos dentro):
 
 * `list`
 * `tuple`
@@ -168,7 +168,7 @@ Declare a variĂĄvel, com a mesma sintaxe com dois pontos (`:`).
 
 Como o tipo, coloque `list`.
 
-Como a lista Ă© um tipo que contĂ©m tipos internos, vocĂȘ os coloca entre colchetes:
+Como a list Ă© um tipo que contĂ©m alguns tipos internos, vocĂȘ os coloca entre colchetes:
 
 {* ../../docs_src/python_types/tutorial006_py310.py hl[1] *}
 
@@ -180,15 +180,15 @@ Neste caso, `str` Ă© o parĂąmetro de tipo passado para `list`.
 
 ///
 
-Isso significa: "a variĂĄvel `items` Ă© uma `list`, e cada um dos itens desta lista Ă© uma `str`".
+Isso significa: "a variĂĄvel `items` Ă© uma `list`, e cada um dos itens desta list Ă© uma `str`".
 
-Ao fazer isso, seu editor pode fornecer suporte mesmo durante o processamento de itens da lista:
+Ao fazer isso, seu editor pode fornecer suporte mesmo durante o processamento de itens da list:
 
 <img src="/img/python-types/image05.png">
 
 Sem tipos, isso Ă© quase impossĂ­vel de alcançar.
 
-Observe que a variĂĄvel `item` Ă© um dos elementos da lista `items`.
+Observe que a variĂĄvel `item` Ă© um dos elementos da list `items`.
 
 E, ainda assim, o editor sabe que Ă© um `str` e fornece suporte para isso.
 
@@ -213,7 +213,7 @@ O segundo parĂąmetro de tipo Ă© para os valores do `dict`:
 
 {* ../../docs_src/python_types/tutorial008_py310.py hl[1] *}
 
-Isso significa que:
+Isso significa:
 
 * A variĂĄvel `prices` Ă© um `dict`:
     * As chaves deste `dict` sĂŁo do tipo `str` (digamos, o nome de cada item).
@@ -275,7 +275,7 @@ VocĂȘ declara a "forma" dos dados como classes com atributos.
 
 E cada atributo tem um tipo.
 
-Em seguida, vocĂȘ cria uma instĂąncia dessa classe com alguns valores e ela os validarĂĄ, os converterĂĄ para o tipo apropriado (se for esse o caso) e fornecerĂĄ um objeto com todos os dados.
+Em seguida, vocĂȘ cria uma instĂąncia dessa classe com alguns valores e ela validarĂĄ os valores, os converterĂĄ para o tipo apropriado (se for esse o caso) e fornecerĂĄ um objeto com todos os dados.
 
 E vocĂȘ recebe todo o suporte do editor com esse objeto resultante.
 
@@ -285,7 +285,7 @@ Um exemplo da documentação oficial do Pydantic:
 
 /// note | Nota
 
-Para saber mais sobre [Pydantic, verifique a documentação](https://docs.pydantic.dev/).
+Para saber mais sobre [Pydantic, verifique a documentação](https://docs.pydantic.dev/).
 
 ///
 
@@ -293,9 +293,9 @@ O **FastAPI** Ă© todo baseado em Pydantic.
 
 VocĂȘ verĂĄ muito mais disso na prĂĄtica no [Tutorial - Guia do usuĂĄrio](tutorial/index.md).
 
-## Type Hints com Metadados de AnotaçÔes { #type-hints-with-metadata-annotations }
+## AnotaçÔes de Tipo com AnotaçÔes de Metadados { #type-hints-with-metadata-annotations }
 
-O Python tambĂ©m possui uma funcionalidade que permite incluir **<dfn title="InformaçÔes sobre os dados, neste caso, informaçÔes sobre o tipo, por exemplo, uma descrição.">metadados</dfn> adicionais** nesses type hints utilizando `Annotated`.
+O Python tambĂ©m possui uma funcionalidade que permite incluir **<dfn title="Dados sobre os dados, neste caso, informaçÔes sobre o tipo, por exemplo, uma descrição.">metadados</dfn> adicionais** nessas anotaçÔes de tipo utilizando `Annotated`.
 
 VocĂȘ pode importar `Annotated` de `typing`.
 
@@ -305,7 +305,7 @@ O Python em si nĂŁo faz nada com este `Annotated`. E para editores e outras ferr
 
 Mas vocĂȘ pode utilizar este espaço dentro do `Annotated` para fornecer ao **FastAPI** metadados adicionais sobre como vocĂȘ deseja que a sua aplicação se comporte.
 
-O importante aqui de se lembrar Ă© que **o primeiro *type parameter*** que vocĂȘ informar ao `Annotated` Ă© o **tipo de fato**. O resto Ă© apenas metadado para outras ferramentas.
+O importante aqui de se lembrar Ă© que **o primeiro *parĂąmetro de tipo*** que vocĂȘ informar ao `Annotated` Ă© o **tipo de fato**. O resto Ă© apenas metadados para outras ferramentas.
 
 Por hora, vocĂȘ precisa apenas saber que o `Annotated` existe, e que ele Ă© Python padrĂŁo. đŸ˜Ž
 
@@ -319,11 +319,11 @@ E tambĂ©m que o seu cĂłdigo serĂĄ muito compatĂ­vel com diversas outras ferramen
 
 ///
 
-## Type hints no **FastAPI** { #type-hints-in-fastapi }
+## AnotaçÔes de tipo no **FastAPI** { #type-hints-in-fastapi }
 
-O **FastAPI** aproveita esses type hints para fazer vĂĄrias coisas.
+O **FastAPI** aproveita essas anotaçÔes de tipo para fazer vĂĄrias coisas.
 
-Com o **FastAPI**, vocĂȘ declara parĂąmetros com type hints e obtĂ©m:
+Com o **FastAPI**, vocĂȘ declara parĂąmetros com anotaçÔes de tipo e obtĂ©m:
 
 * **Suporte ao editor**.
 * **VerificaçÔes de tipo**.
index 263145c49a35ed0b39655259f6d39df8a10030aa..4f9823d40741f8b67b5c924c6db8a4decadfe39c 100644 (file)
@@ -17,16 +17,16 @@ Digamos que vocĂȘ tenha uma estrutura de arquivos como esta:
 ```
 .
 â”œâ”€â”€ app
-│   â”œâ”€â”€ __init__.py
-│   â”œâ”€â”€ main.py
-│   â”œâ”€â”€ dependencies.py
-│   â””── routers
-│   â”‚   â”œâ”€â”€ __init__.py
-│   â”‚   â”œâ”€â”€ items.py
-│   â”‚   â””── users.py
-│   â””── internal
-│       â”œâ”€â”€ __init__.py
-│       â””── admin.py
+│   â”œâ”€â”€ __init__.py
+│   â”œâ”€â”€ main.py
+│   â”œâ”€â”€ dependencies.py
+│   â””── routers
+│   â”‚   â”œâ”€â”€ __init__.py
+│   â”‚   â”œâ”€â”€ items.py
+│   â”‚   â””── users.py
+│   â””── internal
+│       â”œâ”€â”€ __init__.py
+│       â””── admin.py
 ```
 
 /// tip | Dica
@@ -382,11 +382,11 @@ Agora, vamos incluir os `router`s dos submĂłdulos `users` e `items`:
 
 {* ../../docs_src/bigger_applications/app_an_py310/main.py hl[10:11] title["app/main.py"] *}
 
-/// note | Detalhes TĂ©cnicos
+/// note | Nota
 
-O FastAPI mantĂ©m o `APIRouter` original e seus `APIRoute`s ativos quando o router Ă© incluĂ­do na aplicação principal.
+`users.router` contĂ©m o `APIRouter` dentro do arquivo `app/routers/users.py`.
 
-Isso significa que subclasses personalizadas de `APIRouter` e `APIRoute` ainda podem participar depois que o router Ă© incluĂ­do.
+E `items.router` contĂ©m o `APIRouter` dentro do arquivo `app/routers/items.py`.
 
 ///
 
@@ -394,6 +394,14 @@ Com `app.include_router()` podemos adicionar cada `APIRouter` ao aplicativo prin
 
 Ele incluirĂĄ todas as rotas daquele router como parte dele.
 
+/// note | Detalhes TĂ©cnicos
+
+O FastAPI mantĂ©m o `APIRouter` original e seus `APIRoute`s ativos quando o router Ă© incluĂ­do na aplicação principal.
+
+Isso significa que subclasses personalizadas de `APIRouter` e `APIRoute` ainda podem participar depois que o router Ă© incluĂ­do.
+
+///
+
 /// tip | Dica
 
 VocĂȘ nĂŁo precisa se preocupar com desempenho ao incluir routers.
index 310caf972d17bd43dbd9a7d5163883557fb9c94b..e2a59f9bc1bc9853b85bc23665645edb78d8707a 100644 (file)
@@ -8,7 +8,7 @@ VocĂȘ pode definir um atributo como um subtipo. Por exemplo, uma `list` do Pytho
 
 {* ../../docs_src/body_nested_models/tutorial001_py310.py hl[12] *}
 
-Isso farĂĄ com que tags seja uma lista de itens mesmo sem declarar o tipo dos elementos desta lista.
+Isso farĂĄ com que `tags` seja uma lista, mesmo sem declarar o tipo dos elementos desta lista.
 
 ## Campos do tipo Lista com um parĂąmetro de tipo { #list-fields-with-type-parameter }
 
@@ -53,7 +53,7 @@ Cada atributo de um modelo Pydantic tem um tipo.
 
 Mas esse tipo pode ser outro modelo Pydantic.
 
-Portanto, vocĂȘ pode declarar "objects" JSON profundamente aninhados com nomes, tipos e validaçÔes de atributos especĂ­ficos.
+Portanto, vocĂȘ pode declarar "objetos" JSON profundamente aninhados com nomes, tipos e validaçÔes de atributos especĂ­ficos.
 
 Tudo isso, aninhado arbitrariamente.
 
@@ -69,7 +69,7 @@ E entĂŁo podemos usĂĄ-lo como o tipo de um atributo:
 
 {* ../../docs_src/body_nested_models/tutorial004_py310.py hl[18] *}
 
-Isso significa que o **FastAPI** vai esperar um corpo similar Ă :
+Isso significa que o **FastAPI** vai esperar um corpo similar a:
 
 ```JSON
 {
@@ -98,11 +98,11 @@ AlĂ©m dos tipos singulares normais como `str`, `int`, `float`, etc. VocĂȘ tambĂ©
 
 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 declarĂĄ-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 em vez de como uma `str`:
 
 {* ../../docs_src/body_nested_models/tutorial005_py310.py hl[2,8] *}
 
-A string serĂĄ verificada para se tornar uma URL vĂĄlida e documentada no JSON Schema / OpenAPI como tal.
+A string serĂĄ verificada para ser uma URL vĂĄlida e documentada no JSON Schema / OpenAPI como tal.
 
 ## Atributos como listas de submodelos { #attributes-with-lists-of-submodels }
 
@@ -156,7 +156,7 @@ Observe como `Offer` tem uma lista de `Item`s, que por sua vez tĂȘm uma lista op
 
 ## Corpos de listas puras { #bodies-of-pure-lists }
 
-Se o valor de primeiro nĂ­vel do corpo JSON que vocĂȘ espera for um `array` do JSON (uma` lista` do Python), vocĂȘ pode declarar o tipo no parĂąmetro da função, da mesma forma que nos modelos do Pydantic:
+Se o valor de primeiro nĂ­vel do corpo JSON que vocĂȘ espera for um `array` do JSON (uma `list` do Python), vocĂȘ pode declarar o tipo no parĂąmetro da função, da mesma forma que nos modelos do Pydantic:
 
 ```Python
 images: list[Image]
@@ -188,11 +188,11 @@ Isso seria Ăștil se vocĂȘ deseja receber chaves que ainda nĂŁo conhece.
 
 ---
 
-Outro caso Ăștil Ă© quando vocĂȘ deseja ter chaves de outro tipo, por exemplo, `int`.
+Outro caso Ăștil Ă© quando vocĂȘ deseja ter chaves de outro tipo (por exemplo, `int`).
 
 Ă‰ isso que vamos ver aqui.
 
-Neste caso, vocĂȘ aceitaria qualquer `dict`, desde que tenha chavesint` com valores `float`:
+Neste caso, vocĂȘ aceitaria qualquer `dict`, desde que tenha chaves `int` com valores `float`:
 
 {* ../../docs_src/body_nested_models/tutorial009_py310.py hl[7] *}
 
@@ -204,7 +204,7 @@ Mas o Pydantic tem conversĂŁo automĂĄtica de dados.
 
 Isso significa que, embora os clientes da API sĂł possam enviar strings como chaves, desde que essas strings contenham inteiros puros, o Pydantic irĂĄ convertĂȘ-los e validĂĄ-los.
 
-E o `dict` que vocĂȘ recebe como `weights` terĂĄ, na verdade, chaves `int` e valoresfloat`.
+E o `dict` que vocĂȘ recebe como `weights` terĂĄ, na verdade, chaves `int` e valores `float`.
 
 ///
 
@@ -215,7 +215,7 @@ Com **FastAPI** vocĂȘ tem a flexibilidade mĂĄxima fornecida pelos modelos Pydant
 Mas com todos os benefĂ­cios:
 
 * Suporte do editor (preenchimento automĂĄtico em todo canto!)
-* ConversĂŁo de dados (parsing/serialização)
+* ConversĂŁo de dados (tambĂ©m conhecido como parsing / serialização)
 * Validação de dados
 * Documentação dos esquemas
 * Documentação automĂĄtica
index afd652efcc18c319beb7f9215a114845f62ee42a..6aea063d7a9d25ac7e4692b8089cb7df6486ae72 100644 (file)
@@ -1,5 +1,6 @@
 # Corpo da requisição { #request-body }
 
+
 Quando vocĂȘ precisa enviar dados de um cliente (como de um navegador) para sua API, vocĂȘ os envia como um **corpo da requisição**.
 
 O corpo da **requisição** Ă© a informação enviada pelo cliente para sua API. O corpo da **resposta** Ă© a informação que sua API envia para o cliente.
index 0de5ff69e9880272dd090de8c7df2803f3cde772..7b98199e9efea0f7051ec1f3d1bd5310047a86d9 100644 (file)
@@ -99,7 +99,7 @@ Veja como pode parecer:
 
 ---
 
-Se vocĂȘ usar o Pycharm, vocĂȘ pode:
+Se vocĂȘ usar o PyCharm, vocĂȘ pode:
 
 * Abrir o menu "Executar".
 * Selecionar a opção "Depurar...".
index d2eaaed5722b9338352ec73d44f6824d39c0f53b..cb6143e8dd212a9a679e73c3361bb9b39c8e4bd1 100644 (file)
@@ -115,7 +115,7 @@ Se vocĂȘ quiser capturar exceçÔes e criar uma resposta personalizada com base
 
 ## DependĂȘncias com `yield` e `except` { #dependencies-with-yield-and-except }
 
-Se vocĂȘ capturar uma exceção com `except` em uma dependĂȘncia que utilize `yield` e ela nĂŁo for levantada novamente (ou uma nova exceção for levantada), o FastAPI nĂŁo serĂĄ capaz de identificar que houve uma exceção, da mesma forma que aconteceria com Python puro:
+Se vocĂȘ capturar uma exceção com `except` em uma dependĂȘncia que utilize `yield` e nĂŁo a levantar novamente (nem levantar uma nova exceção), o FastAPI nĂŁo serĂĄ capaz de identificar que houve uma exceção, da mesma forma que aconteceria com Python puro:
 
 {* ../../docs_src/dependencies/tutorial008c_an_py310.py hl[15:16] *}
 
@@ -123,7 +123,7 @@ Neste caso, o cliente irĂĄ ver uma resposta *HTTP 500 Internal Server Error* com
 
 ### Sempre `raise` em DependĂȘncias com `yield` e `except` { #always-raise-in-dependencies-with-yield-and-except }
 
-Se vocĂȘ capturar uma exceção em uma dependĂȘncia com `yield`, a menos que vocĂȘ esteja levantando outra `HTTPException` ou coisa parecida, **vocĂȘ deve relançar a exceção original**.
+Se vocĂȘ capturar uma exceção em uma dependĂȘncia com `yield`, a menos que vocĂȘ esteja levantando outra `HTTPException` ou coisa parecida, **vocĂȘ deveria relançar a exceção original**.
 
 VocĂȘ pode relançar a mesma exceção utilizando `raise`:
 
@@ -194,7 +194,7 @@ Mas se vocĂȘ sabe que nĂŁo precisarĂĄ usar a dependĂȘncia depois de retornar da
 
 `Depends()` recebe um parĂąmetro `scope` que pode ser:
 
-* `"function"`: iniciar a dependĂȘncia antes da *função de operação de rota* que trata a requisição, encerrar a dependĂȘncia depois que a *função de operação de rota* termina, mas **antes** de a resposta ser enviada de volta ao cliente. Assim, a função da dependĂȘncia serĂĄ executada **em torno** da *função de operação de rota*.
+* `"function"`: iniciar a dependĂȘncia antes da *função de operação de rota* que trata a requisição, encerrar a dependĂȘncia depois que a *função de operação de rota* termina, mas **antes** de a resposta ser enviada de volta ao cliente. Assim, a função da dependĂȘncia serĂĄ executada **em torno** da ***função*** *de operação de rota*.
 * `"request"`: iniciar a dependĂȘncia antes da *função de operação de rota* que trata a requisição (semelhante a quando se usa `"function"`), mas encerrar **depois** que a resposta Ă© enviada de volta ao cliente. Assim, a função da dependĂȘncia serĂĄ executada **em torno** do ciclo de **requisição** e resposta.
 
 Se nĂŁo for especificado e a dependĂȘncia tiver `yield`, ela terĂĄ `scope` igual a `"request"` por padrĂŁo.
@@ -234,6 +234,7 @@ 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).
+
 ## Gerenciadores de contexto { #context-managers }
 
 ### O que sĂŁo "Gerenciadores de Contexto" { #what-are-context-managers }
index e323d573013dc67d3270c03a4d985380383328c6..dbfeb8dd9356cb8d71b3e0147934d197e27af136 100644 (file)
@@ -36,19 +36,19 @@ 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", [cheque a documentação para mais informaçÔes](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers).
+    * O Pydantic tambĂ©m permite representĂĄ-lo como uma "codificação de diferença de tempo ISO 8601", [veja 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 requisiçÔes, uma list 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 Ășnicos (usando o `uniqueItems` do JSON Schema).
 * `bytes`:
     * O `bytes` padrĂŁo do Python.
-    * Em requisiçÔes e respostas serĂĄ representado como uma `str`.
+    * Em requisiçÔes e respostas serĂĄ tratado como `str`.
     * O esquema gerado vai especificar que Ă© uma `str` com o "formato" `binary`.
 * `Decimal`:
     * O `Decimal` padrĂŁo do Python.
-    * Em requisiçÔes e respostas serĂĄ representado como um `float`.
+    * Em requisiçÔes e respostas, tratado da mesma forma que um `float`.
 * 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 }
index 424e0fe185f1b7bf2816c3a7023795819fa4cc66..19913ca399d403ffb2335352f8304487fff75f90 100644 (file)
@@ -208,4 +208,4 @@ Neste caso, vocĂȘ pode usar `dict`:
 
 Use vĂĄrios modelos Pydantic e herde livremente para cada caso.
 
-NĂŁo Ă© necessĂĄrio ter um Ășnico modelo de dados por entidade se essa entidade precisar ter diferentes "estados". No caso da "entidade" de usuĂĄrio com um estado que inclui `password`, `password_hash` e sem senha.
+NĂŁo Ă© necessĂĄrio ter um Ășnico modelo de dados por entidade se essa entidade precisar ter diferentes "estados". A "entidade" **usuĂĄrio** Ă© um exemplo, com estados que incluem `password`, `password_hash` ou sem senha.
index 1a829a08c524c553cc3bdc8d52f3728ea0b4c2c4..97bbfe018ccb1a284ad74141965daf29be008506 100644 (file)
@@ -84,31 +84,31 @@ VocĂȘ verĂĄ a documentação alternativa automĂĄtica (fornecida por [ReDoc](http
 
 ### OpenAPI { #openapi }
 
-O **FastAPI** gera um "*schema*" com toda a sua API usando o padrĂŁo **OpenAPI** para definir APIs.
+O **FastAPI** gera um "schema" com toda a sua API usando o padrĂŁo **OpenAPI** para definir APIs.
 
-#### "*Schema*" { #schema }
+#### "Schema" { #schema }
 
-Um "*schema*" Ă© uma definição ou descrição de algo. NĂŁo o cĂłdigo que o implementa, mas apenas uma descrição abstrata.
+Um "schema" Ă© uma definição ou descrição de algo. NĂŁo o cĂłdigo que o implementa, mas apenas uma descrição abstrata.
 
-#### API "*schema*" { #api-schema }
+#### API "schema" { #api-schema }
 
-Nesse caso, [OpenAPI](https://github.com/OAI/OpenAPI-Specification) Ă© 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.
+Esta definição de schema inclui os paths da sua API, os parĂąmetros possĂ­veis que eles usam, etc.
 
-#### "*Schema*" de dados { #data-schema }
+#### "Schema" de dados { #data-schema }
 
-O termo "*schema*" tambĂ©m pode se referir Ă  forma de alguns dados, como um conteĂșdo JSON.
+O termo "schema" tambĂ©m pode se referir Ă  forma de alguns dados, como um conteĂșdo JSON.
 
 Nesse caso, significaria os atributos JSON e os tipos de dados que eles possuem, etc.
 
 #### OpenAPI e JSON Schema { #openapi-and-json-schema }
 
-OpenAPI define um *schema* de API para sua API. E esse *schema* inclui definiçÔes (ou "*schemas*") dos dados enviados e recebidos por sua API usando **JSON Schema**, o padrĂŁo para *schemas* de dados JSON.
+OpenAPI define um schema de API para sua API. E esse schema inclui definiçÔes (ou "schemas") dos dados enviados e recebidos por sua API usando **JSON Schema**, o padrĂŁo para schemas de dados JSON.
 
 #### Verifique o `openapi.json` { #check-the-openapi-json }
 
-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.
+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: [http://127.0.0.1:8000/openapi.json](http://127.0.0.1:8000/openapi.json).
 
@@ -137,11 +137,11 @@ Ele mostrarĂĄ um JSON começando com algo como:
 
 #### Para que serve o OpenAPI { #what-is-openapi-for }
 
-O *schema* OpenAPI Ă© o que possibilita os dois sistemas de documentação interativos mostrados.
+O schema OpenAPI Ă© o que possibilita os dois sistemas de documentação interativos mostrados.
 
 E existem dezenas de alternativas, todas baseadas em OpenAPI. VocĂȘ pode facilmente adicionar qualquer uma dessas alternativas Ă  sua aplicação criada com **FastAPI**.
 
-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.
+VocĂȘ tambĂ©m pode usĂĄ-lo para gerar cĂłdigo automaticamente para clientes que se comunicam com sua API. Por exemplo, aplicaçÔes frontend, mĂłveis ou IoT.
 
 ### Configure o `entrypoint` da aplicação em `pyproject.toml` { #configure-the-app-entrypoint-in-pyproject-toml }
 
@@ -244,7 +244,7 @@ Aqui, a variĂĄvel `app` serĂĄ uma "instĂąncia" da classe `FastAPI`.
 
 Este serĂĄ o principal ponto de interação para criar toda a sua API.
 
-### Passo 3: crie uma operação de rota { #step-3-create-a-path-operation }
+### Passo 3: crie uma *operação de rota* { #step-3-create-a-path-operation }
 
 #### Path { #path }
 
@@ -305,14 +305,14 @@ Portanto, no OpenAPI, cada um dos mĂ©todos HTTP Ă© chamado de "operação".
 
 Vamos chamĂĄ-los de "**operaçÔes**" tambĂ©m.
 
-#### Defina um decorador de operação de rota { #define-a-path-operation-decorator }
+#### Defina um *decorador de operação de rota* { #define-a-path-operation-decorator }
 
 {* ../../docs_src/first_steps/tutorial001_py310.py hl[6] *}
 
 O `@app.get("/")` diz ao **FastAPI** que a função logo abaixo Ă© responsĂĄvel por tratar as requisiçÔes que vĂŁo para:
 
 * o path `/`
-* usando uma <dfn title="um mĂ©todo HTTP GET"><code>get</code> operação</dfn>
+* usando uma <dfn title="um mĂ©todo HTTP GET">operação <code>get</code></dfn>
 
 /// note | InformaçÔes sobre `@decorator`
 
@@ -387,7 +387,7 @@ Se vocĂȘ nĂŁo sabe a diferença, verifique o [Async: *"Com pressa?"*](../async.m
 
 VocĂȘ pode retornar um `dict`, `list` e valores singulares como `str`, `int`, etc.
 
-VocĂȘ tambĂ©m pode devolver modelos Pydantic ( vocĂȘ verĂĄ mais sobre isso mais tarde).
+VocĂȘ tambĂ©m pode retornar modelos Pydantic (vocĂȘ verĂĄ mais sobre isso mais tarde).
 
 Existem muitos outros objetos e modelos que serĂŁo convertidos automaticamente para JSON (incluindo ORMs, etc). Tente usar seus favoritos, Ă© altamente provĂĄvel que jĂĄ sejam compatĂ­veis.
 
index c400a1e84813ca2ac78c5fa73617e20f6e53269e..9c7abf0605039d82eecc60dfbc0b381942b53edb 100644 (file)
@@ -6,45 +6,44 @@ Esse cliente pode ser um browser com um frontend, o cĂłdigo de outra pessoa, um
 
 Pode ser que vocĂȘ precise comunicar ao cliente que:
 
-* O cliente nĂŁo tem direitos para realizar aquela operação.
+* O cliente nĂŁo tem privilĂ©gios suficientes para aquela operação.
 * O cliente nĂŁo tem acesso aquele recurso.
-* O item que o cliente estĂĄ tentando acessar nĂŁo existe.
+* O item que o cliente estava tentando acessar nĂŁo existe.
 * etc.
 
-Nesses casos, vocĂȘ normalmente retornaria um **HTTP status code** prĂłximo ao status code na faixa do status code **400** (do 400 ao 499).
+Nesses casos, vocĂȘ normalmente retornaria um **HTTP status code** na faixa de **400** (do 400 ao 499).
 
-Isso Ă© bastante similar ao caso do HTTP status code 200 (do 200 ao 299). Esses "200" status codes significam que, de algum modo, houve sucesso na requisição.
+Isso Ă© similar aos status codes HTTP 200 (do 200 ao 299). Esses status codes "200" significam que, de algum modo, houve um "sucesso" na request.
 
 Os status codes na faixa dos 400 significam que houve um erro por parte do cliente.
 
-VocĂȘ se lembra de todos aqueles erros (e piadas) a respeito do "**404 Not Found**"?
+VocĂȘ se lembra de todos aqueles erros **"404 Not Found"** (e piadas)?
 
 ## Use o `HTTPException` { #use-httpexception }
 
-Para retornar ao cliente *responses* HTTP com erros, use o `HTTPException`.
+Para retornar responses HTTP com erros ao cliente, use o `HTTPException`.
 
-### Import `HTTPException` { #import-httpexception }
+### Importe `HTTPException` { #import-httpexception }
 
 {* ../../docs_src/handling_errors/tutorial001_py310.py hl[1] *}
 
-### Lance o `HTTPException` no seu cĂłdigo { #raise-an-httpexception-in-your-code }
+### Lance uma `HTTPException` no seu cĂłdigo { #raise-an-httpexception-in-your-code }
 
-`HTTPException`, ao fundo, nada mais Ă© do que a conjunção entre uma exceção comum do Python e informaçÔes adicionais relevantes para APIs.
+`HTTPException` Ă© uma exceção normal do Python com dados adicionais relevantes para APIs.
 
-E porque Ă© uma exceção do Python, vocĂȘ nĂŁo **retorna** (return) o `HTTPException`, vocĂȘ lança o (raise) no seu cĂłdigo.
+Como Ă© uma exceção do Python, vocĂȘ nĂŁo dĂĄ `return` nela, vocĂȘ dĂĄ `raise` nela.
 
-Isso tambĂ©m significa que, se vocĂȘ estĂĄ escrevendo uma função de utilidade, a qual vocĂȘ estĂĄ chamando dentro da sua função de operação de rota, e vocĂȘ lança o `HTTPException` dentro da função de utilidade, o resto do seu cĂłdigo nĂŁo serĂĄ executado dentro da função de operação de rota. Ao contrĂĄrio, o `HTTPException` irĂĄ finalizar a requisição no mesmo instante e enviarĂĄ o erro HTTP oriundo do `HTTPException` para o cliente.
+Isso tambĂ©m significa que, se vocĂȘ estĂĄ dentro de uma função de utilidade que estĂĄ chamando dentro da sua *função de operação de rota*, e lança a `HTTPException` dentro dessa função de utilidade, o restante do cĂłdigo na *função de operação de rota* nĂŁo serĂĄ executado, a request serĂĄ encerrada imediatamente e o erro HTTP da `HTTPException` serĂĄ enviado ao cliente.
 
 O benefĂ­cio de lançar uma exceção em vez de retornar um valor ficarĂĄ mais evidente na seção sobre DependĂȘncias e Segurança.
 
-Neste exemplo, quando o cliente pede, na requisição, por um item cujo ID nĂŁo existe, a exceção com o status code `404` Ă© lançada:
+Neste exemplo, quando o cliente solicita um item por um ID que nĂŁo existe, lance uma exceção com status code `404`:
 
 {* ../../docs_src/handling_errors/tutorial001_py310.py hl[11] *}
 
 ### A response resultante { #the-resulting-response }
 
-Se o cliente faz uma requisição para `http://example.com/items/foo` (um `item_id` `"foo"`), esse cliente receberĂĄ um HTTP status code 200, e uma resposta JSON:
-
+Se o cliente solicita `http://example.com/items/foo` (um `item_id` `"foo"`), esse cliente receberĂĄ um status code HTTP 200 e uma response JSON de:
 
 ```JSON
 {
@@ -52,7 +51,7 @@ Se o cliente faz uma requisição para `http://example.com/items/foo` (um `item_
 }
 ```
 
-Mas se o cliente faz uma requisição para `http://example.com/items/bar` (ou seja, um nĂŁo existente `item_id "bar"`), esse cliente receberĂĄ um HTTP status code 404 (o erro "nĂŁo encontrado" â€” *not found error*), e uma resposta JSON:
+Mas se o cliente solicita `http://example.com/items/bar` (um `item_id` `"bar"` inexistente), esse cliente receberĂĄ um status code HTTP 404 (o erro "not found") e uma response JSON de:
 
 ```JSON
 {
@@ -62,38 +61,41 @@ Mas se o cliente faz uma requisição para `http://example.com/items/bar` (ou se
 
 /// tip | Dica
 
-Quando vocĂȘ lançar um `HTTPException`, vocĂȘ pode passar qualquer valor convertĂ­vel em JSON como parĂąmetro de `detail`, e nĂŁo apenas `str`.
+Ao lançar uma `HTTPException`, vocĂȘ pode passar qualquer valor que possa ser convertido para JSON como parĂąmetro `detail`, nĂŁo apenas `str`.
+
+VocĂȘ pode passar um `dict`, uma `list`, etc.
 
-VocĂȘ pode passar um `dict` ou um `list`, etc.
-Esses tipos de dados sĂŁo manipulados automaticamente pelo **FastAPI** e convertidos em JSON.
+Eles sĂŁo manipulados automaticamente pelo **FastAPI** e convertidos para JSON.
 
 ///
 
 ## Adicione headers customizados { #add-custom-headers }
 
-HĂĄ certas situaçÔes em que Ă© bastante Ăștil poder adicionar headers customizados no HTTP error. Exemplo disso seria adicionar headers customizados para tipos de segurança.
+HĂĄ algumas situaçÔes em que Ă© Ăștil poder adicionar headers customizados ao erro HTTP. Por exemplo, para alguns tipos de segurança.
 
-VocĂȘ provavelmente nĂŁo precisarĂĄ utilizar esses headers diretamente no seu cĂłdigo.
+VocĂȘ provavelmente nĂŁo precisarĂĄ usar isso diretamente no seu cĂłdigo.
 
-Mas caso vocĂȘ precise, para um cenĂĄrio mais complexo, vocĂȘ pode adicionar headers customizados:
+Mas caso precise em um cenĂĄrio avançado, vocĂȘ pode adicionar headers customizados:
 
 {* ../../docs_src/handling_errors/tutorial002_py310.py hl[14] *}
 
 ## Instale manipuladores de exceçÔes customizados { #install-custom-exception-handlers }
 
-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/).
+VocĂȘ pode adicionar manipuladores de exceção customizados com [as mesmas utilidades de exceção do Starlette](https://www.starlette.dev/exceptions/).
+
+Digamos que vocĂȘ tenha uma exceção customizada `UnicornException` que vocĂȘ (ou uma biblioteca que vocĂȘ usa) possa lançar com `raise`.
 
-Digamos que vocĂȘ tenha uma exceção customizada `UnicornException` que vocĂȘ (ou uma biblioteca que vocĂȘ use) precise lançar (`raise`).
+E vocĂȘ quer manipular essa exceção globalmente com o FastAPI.
 
-Nesse cenĂĄrio, se vocĂȘ precisa manipular essa exceção de modo global com o FastAPI, vocĂȘ pode adicionar um manipulador de exceção customizada com `@app.exception_handler()`.
+VocĂȘ poderia adicionar um manipulador de exceção customizado com `@app.exception_handler()`:
 
 {* ../../docs_src/handling_errors/tutorial003_py310.py hl[5:7,13:18,24] *}
 
-Nesse cenĂĄrio, se vocĂȘ fizer uma requisição para `/unicorns/yolo`, a *operação de rota* vai lançar (`raise`) o `UnicornException`.
+Aqui, se vocĂȘ fizer uma request para `/unicorns/yolo`, a *operação de rota* vai lançar com `raise` uma `UnicornException`.
 
-Essa exceção serĂĄ manipulada, contudo, pelo `unicorn_exception_handler`.
+Mas ela serĂĄ manipulada pelo `unicorn_exception_handler`.
 
-Dessa forma vocĂȘ receberĂĄ um erro "limpo", com o HTTP status code `418` e um JSON com o conteĂșdo:
+Assim, vocĂȘ receberĂĄ um erro limpo, com um status code HTTP `418` e um conteĂșdo JSON de:
 
 ```JSON
 {"message": "Oops! yolo did something. There goes a rainbow..."}
@@ -103,7 +105,7 @@ Dessa forma vocĂȘ receberĂĄ um erro "limpo", com o HTTP status code `418` e um J
 
 VocĂȘ tambĂ©m pode usar `from starlette.requests import Request` e `from starlette.responses import JSONResponse`.
 
-**FastAPI** disponibiliza o mesmo `starlette.responses` atravĂ©s do `fastapi.responses` por conveniĂȘncia ao desenvolvedor. Contudo, a maior parte das respostas disponĂ­veis vem diretamente do Starlette. O mesmo acontece com o `Request`.
+**FastAPI** fornece o mesmo `starlette.responses` como `fastapi.responses` apenas como uma conveniĂȘncia para vocĂȘ, a pessoa desenvolvedora. Mas a maior parte das responses disponĂ­veis vem diretamente do Starlette. O mesmo acontece com `Request`.
 
 ///
 
@@ -111,23 +113,23 @@ VocĂȘ tambĂ©m pode usar `from starlette.requests import Request` e `from starlet
 
 **FastAPI** tem alguns manipuladores padrĂŁo de exceçÔes.
 
-Esses manipuladores sĂŁo os responsĂĄveis por retornar o JSON padrĂŁo de respostas quando vocĂȘ lança (`raise`) o `HTTPException` e quando a requisição tem dados invĂĄlidos.
+Esses manipuladores sĂŁo responsĂĄveis por retornar as responses JSON padrĂŁo quando vocĂȘ lança com `raise` uma `HTTPException` e quando a request tem dados invĂĄlidos.
 
-VocĂȘ pode sobrescrever esses manipuladores de exceção com os seus prĂłprios manipuladores.
+VocĂȘ pode sobrescrever esses manipuladores de exceção com os seus prĂłprios.
 
-### Sobrescreva exceçÔes de validação da requisição { #override-request-validation-exceptions }
+### Sobrescreva exceçÔes de validação da request { #override-request-validation-exceptions }
 
-Quando a requisição contĂ©m dados invĂĄlidos, **FastAPI** internamente lança para o `RequestValidationError`.
+Quando uma request contĂ©m dados invĂĄlidos, **FastAPI** internamente lança um `RequestValidationError`.
 
 E tambĂ©m inclui um manipulador de exceçÔes padrĂŁo para ele.
 
-Para sobrescrevĂȘ-lo, importe o `RequestValidationError` e use-o com `@app.exception_handler(RequestValidationError)` para decorar o manipulador de exceçÔes.
+Para sobrescrevĂȘ-lo, importe o `RequestValidationError` e use-o com `@app.exception_handler(RequestValidationError)` para decorar o manipulador de exceçÔes.
 
 O manipulador de exceçÔes receberĂĄ um `Request` e a exceção.
 
 {* ../../docs_src/handling_errors/tutorial004_py310.py hl[2,14:19] *}
 
-Se vocĂȘ for ao `/items/foo`, em vez de receber o JSON padrĂŁo com o erro:
+Agora, se vocĂȘ for para `/items/foo`, em vez de receber o erro JSON padrĂŁo com:
 
 ```JSON
 {
@@ -144,7 +146,7 @@ Se vocĂȘ for ao `/items/foo`, em vez de receber o JSON padrĂŁo com o erro:
 }
 ```
 
-vocĂȘ receberĂĄ a versĂŁo em texto:
+vocĂȘ receberĂĄ uma versĂŁo em texto, com:
 
 ```
 Validation errors:
@@ -153,17 +155,17 @@ Field: ('path', 'item_id'), Error: Input should be a valid integer, unable to pa
 
 ### Sobrescreva o manipulador de erro `HTTPException` { #override-the-httpexception-error-handler }
 
-Do mesmo modo, vocĂȘ pode sobrescrever o `HTTPException`.
+Do mesmo modo, vocĂȘ pode sobrescrever o manipulador de `HTTPException`.
 
-Por exemplo, vocĂȘ pode querer retornar uma *response* em *plain text* ao invĂ©s de um JSON para os seguintes erros:
+Por exemplo, vocĂȘ poderia querer retornar uma response em texto simples em vez de JSON para estes erros:
 
 {* ../../docs_src/handling_errors/tutorial004_py310.py hl[3:4,9:11,25] *}
 
 /// note | Detalhes TĂ©cnicos
 
-VocĂȘ pode usar `from starlette.responses import PlainTextResponse`.
+VocĂȘ tambĂ©m pode usar `from starlette.responses import PlainTextResponse`.
 
-**FastAPI** disponibiliza o mesmo `starlette.responses` como `fastapi.responses`, como conveniĂȘncia a vocĂȘ, desenvolvedor. Contudo, a maior parte das respostas disponĂ­veis vem diretamente do Starlette.
+**FastAPI** fornece o mesmo `starlette.responses` como `fastapi.responses` apenas como uma conveniĂȘncia para vocĂȘ, a pessoa desenvolvedora. Mas a maior parte das responses disponĂ­veis vem diretamente do Starlette.
 
 ///
 
@@ -171,19 +173,19 @@ VocĂȘ pode usar `from starlette.responses import PlainTextResponse`.
 
 Tenha em mente que o `RequestValidationError` contĂ©m as informaçÔes do nome do arquivo e da linha onde o erro de validação acontece, para que vocĂȘ possa mostrĂĄ-las nos seus logs com as informaçÔes relevantes, se quiser.
 
-Mas isso significa que, se vocĂȘ simplesmente convertĂȘ-lo para uma string e retornar essa informação diretamente, vocĂȘ pode acabar vazando um pouco de informação sobre o seu sistema; por isso, aqui o cĂłdigo extrai e mostra cada erro de forma independente.
+Mas isso significa que, se vocĂȘ simplesmente convertĂȘ-lo para uma string e retornar essa informação diretamente, vocĂȘ poderia acabar vazando um pouco de informação sobre o seu sistema; por isso, aqui o cĂłdigo extrai e mostra cada erro de forma independente.
 
 ///
 
 ### Use o body do `RequestValidationError` { #use-the-requestvalidationerror-body }
 
-O `RequestValidationError` contĂ©m o `body` que ele recebeu de dados invĂĄlidos.
+O `RequestValidationError` contĂ©m o `body` que ele recebeu com dados invĂĄlidos.
 
-VocĂȘ pode utilizĂĄ-lo enquanto desenvolve seu app para registrar o *body* e debugĂĄ-lo, e assim retornĂĄ-lo ao usuĂĄrio, etc.
+VocĂȘ poderia usĂĄ-lo enquanto desenvolve sua aplicação para registrar o body e depurĂĄ-lo, retornĂĄ-lo ao usuĂĄrio, etc.
 
 {* ../../docs_src/handling_errors/tutorial005_py310.py hl[14] *}
 
-Tente enviar um item invĂĄlido como este:
+Agora tente enviar um item invĂĄlido como:
 
 ```JSON
 {
@@ -192,7 +194,7 @@ Tente enviar um item invĂĄlido como este:
 }
 ```
 
-VocĂȘ receberĂĄ uma *response* informando-o de que os dados sĂŁo invĂĄlidos, e contendo o *body* recebido:
+VocĂȘ receberĂĄ uma response dizendo que os dados sĂŁo invĂĄlidos contendo o body recebido:
 
 ```JSON hl_lines="12-15"
 {
@@ -213,21 +215,21 @@ VocĂȘ receberĂĄ uma *response* informando-o de que os dados sĂŁo invĂĄlidos, e c
 }
 ```
 
-#### O `HTTPException` do FastAPI vs o `HTTPException` do Starlette { #fastapis-httpexception-vs-starlettes-httpexception }
+#### `HTTPException` do FastAPI vs `HTTPException` do Starlette { #fastapis-httpexception-vs-starlettes-httpexception }
 
-O **FastAPI** tem o seu prĂłprio `HTTPException`.
+**FastAPI** tem a sua prĂłpria `HTTPException`.
 
-E a classe de erro `HTTPException` do **FastAPI** herda da classe de erro do `HTTPException` do Starlette.
+E a classe de erro `HTTPException` do **FastAPI** herda da classe de erro `HTTPException` do Starlette.
 
-A Ășnica diferença Ă© que o `HTTPException` do **FastAPI** aceita qualquer dado que possa ser convertido em JSON para o campo `detail`, enquanto o `HTTPException` do Starlette aceita apenas strings para esse campo.
+A Ășnica diferença Ă© que a `HTTPException` do **FastAPI** aceita qualquer dado que possa ser convertido para JSON no campo `detail`, enquanto a `HTTPException` do Starlette aceita apenas strings para ele.
 
-Portanto, vocĂȘ pode continuar lançando o `HTTPException` do **FastAPI** normalmente no seu cĂłdigo.
+Portanto, vocĂȘ pode continuar lançando a `HTTPException` do **FastAPI** normalmente no seu cĂłdigo.
 
-PorĂ©m, quando vocĂȘ registrar um manipulador de exceção, vocĂȘ deve registrĂĄ-lo atravĂ©s do `HTTPException` do Starlette.
+Mas quando registrar um manipulador de exceção, vocĂȘ deveria registrĂĄ-lo para a `HTTPException` do Starlette.
 
-Dessa forma, se qualquer parte do cĂłdigo interno, extensĂŁo ou plug-in do Starlette lançar um `HTTPException` do Starlette, o seu manipulador poderĂĄ capturar e tratĂĄ-lo.
+Dessa forma, se qualquer parte do cĂłdigo interno do Starlette, ou uma extensĂŁo ou plug-in do Starlette, lançar uma `HTTPException` do Starlette, seu manipulador poderĂĄ capturĂĄ-la e tratĂĄ-la.
 
-Neste exemplo, para poder ter ambos os `HTTPException` no mesmo cĂłdigo, a exceção do Starlette Ă© renomeada para `StarletteHTTPException`:
+Neste exemplo, para poder ter ambas as `HTTPException`s no mesmo cĂłdigo, a exceção do Starlette Ă© renomeada para `StarletteHTTPException`:
 
 ```Python
 from starlette.exceptions import HTTPException as StarletteHTTPException
@@ -235,8 +237,8 @@ from starlette.exceptions import HTTPException as StarletteHTTPException
 
 ### Reutilize os manipuladores de exceção do **FastAPI** { #reuse-fastapis-exception-handlers }
 
-Se vocĂȘ quer usar a exceção em conjunto com o mesmo manipulador de exceção *default* do **FastAPI**, vocĂȘ pode importar e re-usar esses manipuladores de exceção do `fastapi.exception_handlers`:
+Se vocĂȘ quiser usar a exceção junto com os mesmos manipuladores de exceção padrĂŁo do **FastAPI**, vocĂȘ pode importar e reutilizar os manipuladores de exceção padrĂŁo de `fastapi.exception_handlers`:
 
 {* ../../docs_src/handling_errors/tutorial006_py310.py hl[2:5,15,21] *}
 
-Nesse exemplo vocĂȘ apenas imprime (`print`) o erro com uma mensagem expressiva. Mesmo assim, dĂĄ para pegar a ideia. VocĂȘ pode usar a exceção e entĂŁo apenas re-usar o manipulador de exceção *default*.
+Neste exemplo, vocĂȘ estĂĄ apenas imprimindo o erro com uma mensagem muito expressiva, mas a ideia Ă© essa. VocĂȘ pode usar a exceção e entĂŁo simplesmente reutilizar os manipuladores de exceção padrĂŁo.
index 49cb48adb16cd7d07de4b245ee1e9edaf7996f1a..57396e2a04590743f0ed3e176ad4619db8769cc1 100644 (file)
@@ -1,16 +1,16 @@
 # Tutorial - Guia de UsuĂĄrio { #tutorial-user-guide }
 
-Esse tutorial mostra como usar o **FastAPI** com a maior parte de seus recursos, passo a passo.
+Este tutorial mostra como usar o **FastAPI** com a maior parte de seus recursos, passo a passo.
 
 Cada seção constrĂłi, gradualmente, sobre as anteriores, mas sua estrutura sĂŁo tĂłpicos separados, para que vocĂȘ possa ir a qualquer um especĂ­fico e resolver suas necessidades especĂ­ficas de API.
 
 Ele tambĂ©m foi construĂ­do para servir como uma referĂȘncia futura, entĂŁo vocĂȘ pode voltar e ver exatamente o que vocĂȘ precisa.
 
-## Rode o cĂłdigo { #run-the-code }
+## Execute o cĂłdigo { #run-the-code }
 
 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`:
+Para executar qualquer um dos exemplos, copie o cĂłdigo para um arquivo `main.py`, e inicie o `fastapi dev`:
 
 <div class="termy">
 
@@ -52,9 +52,9 @@ $ <font color="#4E9A06">fastapi</font> dev
 
 </div>
 
-É **ALTAMENTE recomendado** que vocĂȘ escreva ou copie o cĂłdigo, edite-o e rode-o localmente.
+É **ALTAMENTE recomendado** que vocĂȘ escreva ou copie o cĂłdigo, edite-o e execute-o localmente.
 
-UsĂĄ-lo em seu editor Ă© o que realmente te mostra os benefĂ­cios do FastAPI, ver quĂŁo pouco cĂłdigo vocĂȘ tem que escrever, todas as conferĂȘncias de tipo, preenchimento automĂĄtico, etc.
+UsĂĄ-lo em seu editor Ă© o que realmente mostra os benefĂ­cios do FastAPI, vendo quĂŁo pouco cĂłdigo vocĂȘ tem que escrever, todas as verificaçÔes de tipo, preenchimento automĂĄtico, etc.
 
 ---
 
@@ -94,7 +94,7 @@ O FastAPI tem uma [extensĂŁo oficial para o VS Code](https://marketplace.visuals
 
 HĂĄ tambĂ©m um **Guia Avançado de UsuĂĄrio** que vocĂȘ pode ler apĂłs esse **Tutorial - Guia de UsuĂĄrio**.
 
-O **Guia Avançado de UsuĂĄrio** constrĂłi sobre esse, usa os mesmos conceitos e te ensina algumas funcionalidades extras.
+O **Guia Avançado de UsuĂĄrio** constrĂłi sobre esse, usa os mesmos conceitos e ensina algumas funcionalidades extras.
 
 Mas vocĂȘ deveria ler primeiro o **Tutorial - Guia de UsuĂĄrio** (que vocĂȘ estĂĄ lendo agora).
 
index 022e622cafdacd16cae1e7a5f86f77fd9369a868..c6f76d215822c53a550402fe6585fefae10a47af 100644 (file)
@@ -11,7 +11,7 @@ VocĂȘ pode definir os seguintes campos que sĂŁo usados na especificação OpenAP
 | `title` | `str` | O tĂ­tulo da API. |
 | `summary` | `str` | Um breve resumo da API. <small>DisponĂ­vel desde OpenAPI 3.1.0, FastAPI 0.99.0.</small> |
 | `description` | `str` | Uma breve descrição da API. Pode usar Markdown. |
-| `version` | `string` | A versĂŁo da API. Esta Ă© a versĂŁo da sua aplicação, nĂŁo do OpenAPI. Por exemplo, `2.5.0`. |
+| `version` | `str` | 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 [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> |
@@ -80,7 +80,7 @@ Leia mais sobre tags em [Configuração de operação de rota](path-operation-co
 
 ///
 
-### Cheque os documentos { #check-the-docs }
+### Verifique a documentação { #check-the-docs }
 
 Agora, se vocĂȘ verificar a documentação, ela exibirĂĄ todos os metadados adicionais:
 
index 3559667bd8c89b659f204e0c3c0f086dc3a5baa8..cce159fa690512ae11c2a65d2585eb54878e708d 100644 (file)
@@ -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`.
 
index fe703c624832f64c61a2a7637af99e5ecc79486d..d37db287554ea4ae73c56d3a50f9d3da07cf10df 100644 (file)
@@ -18,7 +18,7 @@ Ter `str | None` permitirĂĄ que seu editor lhe ofereça melhor suporte e detecte
 
 ## Validação adicional { #additional-validation }
 
-Vamos impor que, embora `q` seja opcional, sempre que for fornecido, seu comprimento nĂŁo exceda 50 caracteres.
+Vamos impor que, embora `q` seja opcional, sempre que for fornecido, **seu comprimento nĂŁo exceda 50 caracteres**.
 
 ### Importe `Query` e `Annotated` { #import-query-and-annotated }
 
@@ -69,19 +69,19 @@ Agora que temos esse `Annotated` onde podemos colocar mais informaçÔes (neste
 
 Perceba que o valor padrĂŁo continua sendo `None`, entĂŁo o parĂąmetro ainda Ă© opcional.
 
-Mas agora, com `Query(max_length=50)` dentro de `Annotated`, estamos dizendo ao FastAPI que queremos validação adicional para este valor, queremos que tenha no mĂĄximo 50 caracteres. đŸ˜Ž
+Mas agora, com `Query(max_length=50)` dentro de `Annotated`, estamos dizendo ao FastAPI que queremos **validação adicional** para este valor, queremos que tenha no mĂĄximo 50 caracteres. đŸ˜Ž
 
 /// tip | Dica
 
-Aqui estamos usando `Query()` porque este Ă© um parĂąmetro de consulta. Mais adiante veremos outros como `Path()`, `Body()`, `Header()` e `Cookie()`, que tambĂ©m aceitam os mesmos argumentos que `Query()`.
+Aqui estamos usando `Query()` porque este Ă© um **parĂąmetro de consulta**. Mais adiante veremos outros como `Path()`, `Body()`, `Header()` e `Cookie()`, que tambĂ©m aceitam os mesmos argumentos que `Query()`.
 
 ///
 
 Agora o FastAPI vai:
 
-* Validar os dados garantindo que o comprimento mĂĄximo seja de 50 caracteres
-* Mostrar um erro claro para o cliente quando os dados nĂŁo forem vĂĄlidos
-* Documentar o parĂąmetro na operação de rota do esquema OpenAPI (entĂŁo ele aparecerĂĄ na UI de docs automĂĄtica)
+* **Validar** os dados garantindo que o comprimento mĂĄximo seja de 50 caracteres
+* Mostrar um **erro claro** para o cliente quando os dados nĂŁo forem vĂĄlidos
+* **Documentar** o parĂąmetro na *operação de rota* do esquema OpenAPI (entĂŁo ele aparecerĂĄ na **UI de documentação automĂĄtica**)
 
 ## Alternativa (antiga): `Query` como valor padrĂŁo { #alternative-old-query-as-the-default-value }
 
@@ -120,7 +120,7 @@ EntĂŁo, podemos passar mais parĂąmetros para `Query`. Neste caso, o parĂąmetro `
 q: str | None = Query(default=None, max_length=50)
 ```
 
-Isso validarĂĄ os dados, mostrarĂĄ um erro claro quando os dados nĂŁo forem vĂĄlidos e documentarĂĄ o parĂąmetro na operação de rota do esquema OpenAPI.
+Isso validarĂĄ os dados, mostrarĂĄ um erro claro quando os dados nĂŁo forem vĂĄlidos e documentarĂĄ o parĂąmetro na *operação de rota* do esquema OpenAPI.
 
 ### `Query` como valor padrĂŁo ou em `Annotated` { #query-as-the-default-value-or-in-annotated }
 
@@ -150,13 +150,13 @@ q: str = Query(default="rick")
 
 ### Vantagens de `Annotated` { #advantages-of-annotated }
 
-Usar `Annotated` Ă© recomendado em vez do valor padrĂŁo nos parĂąmetros da função, Ă© melhor por vĂĄrios motivos. đŸ€“
+**Usar `Annotated` Ă© recomendado** em vez do valor padrĂŁo nos parĂąmetros da função, Ă© **melhor** por vĂĄrios motivos. đŸ€“
 
-O valor padrĂŁo do parĂąmetro da função Ă© o valor padrĂŁo real, isso Ă© mais intuitivo com Python em geral. đŸ˜Œ
+O valor **padrĂŁo** do **parĂąmetro da função** Ă© o valor **padrĂŁo real**, isso Ă© mais intuitivo com Python em geral. đŸ˜Œ
 
-VocĂȘ poderia chamar essa mesma função em outros lugares sem FastAPI, e ela funcionaria como esperado. Se houver um parĂąmetro obrigatĂłrio (sem valor padrĂŁo), seu editor vai avisar com um erro, e o Python tambĂ©m reclamarĂĄ se vocĂȘ executĂĄ-la sem passar o parĂąmetro obrigatĂłrio.
+VocĂȘ poderia **chamar** essa mesma função em **outros lugares** sem FastAPI, e ela **funcionaria como esperado**. Se houver um parĂąmetro **obrigatĂłrio** (sem valor padrĂŁo), seu **editor** vai avisar com um erro, e o **Python** tambĂ©m reclamarĂĄ se vocĂȘ executĂĄ-la sem passar o parĂąmetro obrigatĂłrio.
 
-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.
+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 [Typer](https://typer.tiangolo.com/). đŸš€
 
@@ -168,7 +168,7 @@ VocĂȘ tambĂ©m pode adicionar um parĂąmetro `min_length`:
 
 ## Adicione expressĂ”es regulares { #add-regular-expressions }
 
-VocĂȘ pode definir um `pattern` de <dfn title="Uma expressĂŁo regular (regex ou regexp) Ă© uma sequĂȘncia de caracteres que define um padrĂŁo de busca para strings.">expressĂŁo regular</dfn> que o parĂąmetro deve corresponder:
+VocĂȘ pode definir um `pattern` de <dfn title="Uma expressĂŁo regular, regex ou regexp Ă© uma sequĂȘncia de caracteres que define um padrĂŁo de busca para strings.">expressĂŁo regular</dfn> que o parĂąmetro deve corresponder:
 
 {* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *}
 
@@ -178,9 +178,9 @@ Esse padrĂŁo especĂ­fico de expressĂŁo regular verifica se o valor recebido no p
 * `fixedquery`: tem exatamente o valor `fixedquery`.
 * `$`: termina ali, nĂŁo tem mais caracteres depois de `fixedquery`.
 
-Se vocĂȘ se sentir perdido com essas ideias de "expressĂŁo regular", nĂŁo se preocupe. Esse Ă© um assunto difĂ­cil para muitas pessoas. VocĂȘ ainda pode fazer muitas coisas sem precisar de expressĂ”es regulares por enquanto.
+Se vocĂȘ se sentir perdido com essas ideias de **"expressĂŁo regular"**, nĂŁo se preocupe. Esse Ă© um assunto difĂ­cil para muitas pessoas. VocĂȘ ainda pode fazer muitas coisas sem precisar de expressĂ”es regulares por enquanto.
 
-Agora vocĂȘ sabe que, sempre que precisar delas, pode usĂĄ-las no FastAPI.
+Agora vocĂȘ sabe que, sempre que precisar delas, pode usĂĄ-las no **FastAPI**.
 
 ## Valores padrĂŁo { #default-values }
 
@@ -242,7 +242,7 @@ EntĂŁo, com uma URL como:
 http://localhost:8000/items/?q=foo&q=bar
 ```
 
-vocĂȘ receberia os mĂșltiplos valores dos parĂąmetros de consulta `q` (`foo` e `bar`) em uma `list` Python dentro da sua função de operação de rota, no parĂąmetro da função `q`.
+vocĂȘ receberia os mĂșltiplos valores dos *parĂąmetros de consulta* `q` (`foo` e `bar`) em uma `list` Python dentro da sua *função de operação de rota*, no *parĂąmetro da função* `q`.
 
 Assim, a resposta para essa URL seria:
 
@@ -360,15 +360,15 @@ A documentação vai mostrar assim:
 
 ## Excluir parĂąmetros do OpenAPI { #exclude-parameters-from-openapi }
 
-Para excluir um parĂąmetro de consulta do OpenAPI gerado (e portanto, dos sistemas de documentação automĂĄticos), defina o parĂąmetro `include_in_schema` de `Query` como `False`:
+Para excluir um parĂąmetro de consulta do esquema OpenAPI gerado (e portanto, dos sistemas de documentação automĂĄticos), defina o parĂąmetro `include_in_schema` de `Query` como `False`:
 
 {* ../../docs_src/query_params_str_validations/tutorial014_an_py310.py hl[10] *}
 
 ## Validação personalizada { #custom-validation }
 
-Podem existir casos em que vocĂȘ precise fazer alguma validação personalizada que nĂŁo pode ser feita com os parĂąmetros mostrados acima.
+Podem existir casos em que vocĂȘ precise fazer alguma **validação personalizada** que nĂŁo pode ser feita com os parĂąmetros mostrados acima.
 
-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`).
+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 [`AfterValidator` do Pydantic](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) dentro de `Annotated`.
 
@@ -390,15 +390,15 @@ Isso estĂĄ disponĂ­vel com a versĂŁo 2 do Pydantic ou superior. đŸ˜Ž
 
 /// tip | Dica
 
-Se vocĂȘ precisar fazer qualquer tipo de validação que exija comunicação com algum componente externo, como um banco de dados ou outra API, vocĂȘ deveria usar DependĂȘncias do FastAPI em vez disso; vocĂȘ aprenderĂĄ sobre elas mais adiante.
+Se vocĂȘ precisar fazer qualquer tipo de validação que exija comunicação com algum **componente externo**, como um banco de dados ou outra API, vocĂȘ deveria usar **DependĂȘncias do FastAPI** em vez disso; vocĂȘ aprenderĂĄ sobre elas mais adiante.
 
-Esses validadores personalizados sĂŁo para coisas que podem ser verificadas apenas com os mesmos dados fornecidos na requisição.
+Esses validadores personalizados sĂŁo para coisas que podem ser verificadas **apenas** com os **mesmos dados** fornecidos na requisição.
 
 ///
 
 ### Entenda esse cĂłdigo { #understand-that-code }
 
-O ponto importante Ă© apenas usar `AfterValidator` com uma função dentro de `Annotated`. Sinta-se Ă  vontade para pular esta parte. đŸ€ž
+O ponto importante Ă© apenas usar **`AfterValidator` com uma função dentro de `Annotated`**. Sinta-se Ă  vontade para pular esta parte. đŸ€ž
 
 ---
 
@@ -416,13 +416,13 @@ Com `data.items()` obtemos um <dfn title="Algo que podemos iterar com um laço f
 
 Convertemos esse objeto iterĂĄvel em uma `list` adequada com `list(data.items())`.
 
-Em seguida, com `random.choice()` podemos obter um valor aleatĂłrio da lista, entĂŁo obtemos uma tupla com `(id, name)`. SerĂĄ algo como `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`.
+Em seguida, com `random.choice()` podemos obter um **valor aleatĂłrio** da lista, entĂŁo obtemos uma tupla com `(id, name)`. SerĂĄ algo como `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`.
 
-Depois atribuĂ­mos esses dois valores da tupla Ă s variĂĄveis `id` e `name`.
+Depois **atribuĂ­mos esses dois valores** da tupla Ă s variĂĄveis `id` e `name`.
 
 Assim, se o usuĂĄrio nĂŁo fornecer um ID de item, ele ainda receberĂĄ uma sugestĂŁo aleatĂłria.
 
-...fazemos tudo isso em uma Ășnica linha simples. đŸ€Ż VocĂȘ nĂŁo ama Python? đŸ
+...fazemos tudo isso em uma **Ășnica linha simples**. đŸ€Ż VocĂȘ nĂŁo ama Python? đŸ
 
 {* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[22:30] hl[29] *}
 
index d64e2dc64a3bd96c418dbfb3f9f52c1faf8de184..1f098ee7a693be7d10518e7f17646d3df29a673e 100644 (file)
@@ -54,8 +54,8 @@ http://127.0.0.1:8000/items/?skip=20
 
 Os valores dos parĂąmetros na sua função serĂŁo:
 
-* `skip=20`: Por que vocĂȘ definiu isso na URL
-* `limit=10`: Por que esse era o valor padrĂŁo
+* `skip=20`: porque vocĂȘ definiu isso na URL
+* `limit=10`: porque esse era o valor padrĂŁo
 
 ## ParĂąmetros opcionais { #optional-parameters }
 
@@ -109,6 +109,7 @@ http://127.0.0.1:8000/items/foo?short=yes
 
 ou qualquer outra variação (tudo em maiĂșscula, primeira letra em maiĂșscula, etc), a sua função vai ver o parĂąmetro `short` com um valor `bool` de `True`. Caso contrĂĄrio `False`.
 
+
 ## MĂșltiplos parĂąmetros de rota e consulta { #multiple-path-and-query-parameters }
 
 VocĂȘ pode declarar mĂșltiplos parĂąmetros de rota e parĂąmetros de consulta ao mesmo tempo, o **FastAPI** vai saber o quĂȘ Ă© o quĂȘ.
@@ -129,9 +130,9 @@ 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 da consulta `needy` Ă© um valor obrigatĂłrio, do tipo `str`.
+Aqui o parĂąmetro da consulta `needy` Ă© um parĂąmetro de consulta obrigatĂłrio, do tipo `str`.
 
-Se vocĂȘ abrir no seu navegador a URL:
+Se vocĂȘ abrir no seu navegador uma URL como:
 
 ```
 http://127.0.0.1:8000/items/foo-item
index 72069c2685dc8b9761e9d2aec097aeba49ae31c4..8b3463036d317a579eb7cb7b874090892b46671f 100644 (file)
@@ -44,7 +44,7 @@ Para declarar corpos de arquivos, vocĂȘ precisa usar `File`, caso contrĂĄrio, os
 
 Os arquivos serĂŁo enviados como "dados de formulĂĄrio".
 
-Se vocĂȘ declarar o tipo do parĂąmetro da função da sua *operação de rota* como `bytes`, o **FastAPI** lerĂĄ o arquivo para vocĂȘ e vocĂȘ receberĂĄ o conteĂșdo como `bytes`.
+Se vocĂȘ declarar o tipo do parĂąmetro da sua *função de operação de rota* como `bytes`, o **FastAPI** lerĂĄ o arquivo para vocĂȘ e vocĂȘ receberĂĄ o conteĂșdo como `bytes`.
 
 Mantenha em mente que isso significa que todo o conteĂșdo serĂĄ armazenado na memĂłria. Isso funcionarĂĄ bem para arquivos pequenos.
 
@@ -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 [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.
+* Ele tem uma interface [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) `async`.
+* Ele expĂ”e um objeto Python [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) real que vocĂȘ pode passar diretamente para outras bibliotecas que esperam um objeto semelhante a um arquivo.
 
 ### `UploadFile` { #uploadfile }
 
@@ -72,9 +72,9 @@ 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 [`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.
+* `file`: Um [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) (um objeto [file-like](https://docs.python.org/3/glossary.html#term-file-like-object)). 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).
+`UploadFile` tem os seguintes mĂ©todos `async`. Todos eles chamam os mĂ©todos de arquivo correspondentes por baixo dos panos (usando o `SpooledTemporaryFile` interno).
 
 * `write(data)`: Escreve `data` (`str` ou `bytes`) no arquivo.
 * `read(size)`: LĂȘ `size` (`int`) bytes/caracteres do arquivo.
@@ -83,15 +83,15 @@ Utilizar `UploadFile` tem vĂĄrias vantagens sobre `bytes`:
     * Isso Ă© especialmente Ăștil se vocĂȘ executar `await myfile.read()` uma vez e precisar ler o conteĂșdo novamente.
 * `close()`: Fecha o arquivo.
 
-Como todos esses mĂ©todos sĂŁo mĂ©todos `assĂ­ncronos`, vocĂȘ precisa "aguardar" por eles.
+Como todos esses mĂ©todos sĂŁo mĂ©todos `async`, vocĂȘ precisa "aguardar" por eles.
 
-Por exemplo, dentro de uma função de *operação de rota* `assĂ­ncrona`, vocĂȘ pode obter o conteĂșdo com:
+Por exemplo, dentro de uma *função de operação de rota* `async`, vocĂȘ pode obter o conteĂșdo com:
 
 ```Python
 contents = await myfile.read()
 ```
 
-Se vocĂȘ estiver dentro de uma função de *operação de rota* normal `def`, vocĂȘ pode acessar o `UploadFile.file` diretamente, por exemplo:
+Se vocĂȘ estiver dentro de uma *função de operação de rota* normal `def`, vocĂȘ pode acessar o `UploadFile.file` diretamente, por exemplo:
 
 ```Python
 contents = myfile.file.read()
@@ -109,7 +109,7 @@ O `UploadFile` do **FastAPI** herda diretamente do `UploadFile` do **Starlette**
 
 ///
 
-## O que Ă© "Form Data" { #what-is-form-data }
+## O que sĂŁo "Dados de FormulĂĄrio" { #what-is-form-data }
 
 O jeito que os formulĂĄrios HTML (`<form></form>`) enviam os dados para o servidor normalmente usa uma codificação "especial" para esses dados, a qual Ă© diferente do JSON.
 
@@ -119,9 +119,9 @@ O jeito que os formulĂĄrios HTML (`<form></form>`) enviam os dados para o servid
 
 Dados de formulĂĄrios normalmente sĂŁo codificados usando o "media type" `application/x-www-form-urlencoded` quando nĂŁo incluem arquivos.
 
-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.
+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.
 
-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).
+Se vocĂȘ quiser ler mais sobre essas codificaçÔes e campos de formulĂĄrio, vĂĄ para a [documentação web da <abbr title="Mozilla Developer Network - Rede de Desenvolvedores da Mozilla">MDN</abbr> para `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
 
 ///
 
index d99c516503ec0cc719e7be7e10f2cfdb854d65f0..bfca3562aaf9b6eaa14f0518024c81cc36d5bb5d 100644 (file)
@@ -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 [<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).
+Se vocĂȘ quiser ler mais sobre essas codificaçÔes e campos de formulĂĄrio, vĂĄ para a [documentação web da <abbr title="Mozilla Developer Network - Rede de Desenvolvedores da Mozilla">MDN</abbr> para `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
 
 ///
 
index f02aeb0b4783524071de5139c247ea9c1adcb317..aeeaf225dd80b75d55c1abe0686c821f35e21f66 100644 (file)
@@ -12,7 +12,7 @@ Da mesma forma que vocĂȘ pode especificar um modelo de resposta, vocĂȘ tambĂ©m p
 
 /// note | Nota
 
-Observe que `status_code` Ă© um parĂąmetro do mĂ©todo "decorador" (`get`, `post`, etc). NĂŁo da sua função de *operação de rota*, como todos os parĂąmetros e corpo.
+Observe que `status_code` Ă© um parĂąmetro do mĂ©todo "decorador" (`get`, `post`, etc). NĂŁo da sua *função de operação de rota*, como todos os parĂąmetros e corpo.
 
 ///
 
@@ -35,7 +35,7 @@ Dessa forma:
 
 Alguns cĂłdigos de resposta (consulte a prĂłxima seção) indicam que a resposta nĂŁo possui um corpo.
 
-O FastAPI sabe disso e produzirĂĄ documentos OpenAPI informando que nĂŁo hĂĄ corpo de resposta.
+O FastAPI sabe disso e produzirĂĄ documentação OpenAPI informando que nĂŁo hĂĄ corpo de resposta.
 
 ///
 
@@ -84,7 +84,7 @@ VocĂȘ pode usar as variĂĄveis de conveniĂȘncia de `fastapi.status`.
 
 {* ../../docs_src/response_status_code/tutorial002_py310.py hl[1,6] *}
 
-Eles sĂŁo apenas uma conveniĂȘncia, eles possuem o mesmo nĂșmero, mas dessa forma vocĂȘ pode usar o preenchimento automĂĄtico do editor para encontrĂĄ-los:
+Eles sĂŁo apenas uma conveniĂȘncia, eles possuem o mesmo nĂșmero, mas dessa forma vocĂȘ pode usar o autocompletar do editor para encontrĂĄ-los:
 
 <img src="/img/tutorial/response-status-code/image02.png">
 
index 2feeb54389af6e8edafae5f665db3439ddb9be38..6e10c5857c193afce23dbc21a3a9338f47087ce8 100644 (file)
@@ -1,5 +1,6 @@
 # Declare dados de exemplo da requisição { #declare-request-example-data }
 
+
 VocĂȘ pode declarar exemplos dos dados que sua aplicação pode receber.
 
 Aqui estĂŁo vĂĄrias maneiras de fazer isso.
index fe5b4e704cf7486a3064c0b2255bb7cf6d0453b4..9780f8a69c77c30fe82027a5dc6811fd2cfcdcf8 100644 (file)
@@ -62,9 +62,9 @@ VocĂȘ verĂĄ algo deste tipo:
 
 /// tip | BotĂŁo Autorizar!
 
-VocĂȘ jĂĄ tem um novo botĂŁo 'Authorize'.
+VocĂȘ jĂĄ tem um novo e brilhante botĂŁo "Authorize".
 
-E sua operação de rota tem um pequeno cadeado no canto superior direito em que vocĂȘ pode clicar.
+E sua *operação de rota* tem um pequeno cadeado no canto superior direito em que vocĂȘ pode clicar.
 
 ///
 
@@ -80,7 +80,7 @@ NĂŁo importa o que vocĂȘ digite no formulĂĄrio, ainda nĂŁo vai funcionar. Mas n
 
 Claro que este nĂŁo Ă© o frontend para os usuĂĄrios finais, mas Ă© uma Ăłtima ferramenta automĂĄtica para documentar interativamente toda a sua API.
 
-Pode ser usada pelo time de frontend (que pode ser vocĂȘ mesmo).
+Pode ser usada pela equipe de frontend (que pode ser vocĂȘ mesmo).
 
 Pode ser usada por aplicaçÔes e sistemas de terceiros.
 
@@ -106,7 +106,7 @@ EntĂŁo, vamos rever de um ponto de vista simplificado:
         * EntĂŁo, o usuĂĄrio terĂĄ que fazer login novamente em algum momento.
         * E se o token for roubado, o risco Ă© menor. NĂŁo Ă© como uma chave permanente que funcionarĂĄ para sempre (na maioria dos casos).
 * O frontend armazena esse token temporariamente em algum lugar.
-* O usuĂĄrio clica no frontend para ir para outra seção do aplicativo web.
+* O usuĂĄrio clica no frontend para ir para outra seção da aplicação web do frontend.
 * O frontend precisa buscar mais dados da API.
     * Mas precisa de autenticação para aquele endpoint especĂ­fico.
     * EntĂŁo, para autenticar com nossa API, ele envia um header `Authorization` com o valor `Bearer ` mais o token.
@@ -144,7 +144,7 @@ Usar uma URL relativa Ă© importante para garantir que sua aplicação continue f
 
 ///
 
-Esse parĂąmetro nĂŁo cria aquele endpoint/operação de rota, mas declara que a URL `/token` serĂĄ aquela que o client deve usar para obter o token. Essa informação Ă© usada no OpenAPI e depois nos sistemas de documentação interativa da API.
+Esse parĂąmetro nĂŁo cria aquele endpoint / *operação de rota*, mas declara que a URL `/token` serĂĄ aquela que o client deve usar para obter o token. Essa informação Ă© usada no OpenAPI e depois nos sistemas de documentação interativa da API.
 
 Em breve tambĂ©m criaremos a operação de rota real.
 
index 2c505f148b948434fe7ed9b53bae6e43c6b05c05..d56de4f8f4e93fe9e3f8f0716628cee218daae6c 100644 (file)
@@ -14,7 +14,7 @@ Primeiro, vamos criar um modelo de usuĂĄrio com Pydantic.
 
 Da mesma forma que usamos o Pydantic para declarar corpos, podemos usĂĄ-lo em qualquer outro lugar:
 
-{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *}
+{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
 
 ## Criar uma dependĂȘncia `get_current_user` { #create-a-get-current-user-dependency }
 
index a571b799dcdd9d8922c2eadacd5f870b19b2f08a..dbbbdc79dad72ad03259faba2581ff32a93dc904 100644 (file)
@@ -1,6 +1,6 @@
 # OAuth2 com Senha (e hashing), Bearer com tokens JWT { #oauth2-with-password-and-hashing-bearer-with-jwt-tokens }
 
-Agora que temos todo o fluxo de segurança, vamos tornar a aplicação realmente segura, usando tokens <abbr title="JSON Web Tokens">JWT</abbr> e hashing de senhas seguras.
+Agora que temos todo o fluxo de segurança, vamos tornar a aplicação realmente segura, usando tokens <abbr title="JSON Web Tokens">JWT</abbr> e hashing seguro de senhas.
 
 Este cĂłdigo Ă© algo que vocĂȘ pode realmente usar na sua aplicação, salvar os hashes das senhas no seu banco de dados, etc.
 
@@ -44,7 +44,7 @@ $ pip install pyjwt
 
 /// note | Nota
 
-Se vocĂȘ pretende utilizar algoritmos de assinatura digital como o RSA ou o ECDSA, vocĂȘ deve instalar a dependĂȘncia da biblioteca de criptografia `pyjwt[crypto]`.
+Se vocĂȘ pretende utilizar algoritmos de assinatura digital como o RSA ou o ECDSA, vocĂȘ deveria instalar a dependĂȘncia da biblioteca de criptografia `pyjwt[crypto]`.
 
 VocĂȘ pode ler mais sobre isso na [documentação de instalação do PyJWT](https://pyjwt.readthedocs.io/en/latest/installation.html).
 
@@ -88,7 +88,7 @@ $ pip install "pwdlib[argon2]"
 
 Com o `pwdlib`, vocĂȘ poderia atĂ© configurĂĄ-lo para ser capaz de ler senhas criadas pelo **Django**, um plug-in de segurança do **Flask** ou muitos outros.
 
-Assim, vocĂȘ poderia, por exemplo, compartilhar os mesmos dados de um aplicativo Django em um banco de dados com um aplicativo FastAPI. Ou migrar gradualmente uma aplicação Django usando o mesmo banco de dados.
+Assim, vocĂȘ poderia, por exemplo, compartilhar os mesmos dados de uma aplicação Django em um banco de dados com uma aplicação FastAPI. Ou migrar gradualmente uma aplicação Django usando o mesmo banco de dados.
 
 E seus usuĂĄrios poderiam fazer login tanto pela sua aplicação Django quanto pela sua aplicação **FastAPI**, ao mesmo tempo.
 
@@ -260,7 +260,7 @@ Com o que vocĂȘ viu atĂ© agora, vocĂȘ pode configurar uma aplicação **FastAPI*
 
 Em quase qualquer framework, lidar com a segurança se torna rapidamente um assunto bastante complexo.
 
-Muitos pacotes que simplificam bastante isso precisam fazer muitas concessĂ”es com o modelo de dados, o banco de dados e os recursos disponĂ­veis. E alguns desses pacotes que simplificam demais na verdade tĂȘm falhas de segurança subjacentes.
+Muitos pacotes que simplificam bastante isso precisam fazer muitas concessĂ”es com o modelo de dados, o banco de dados e as funcionalidades disponĂ­veis. E alguns desses pacotes que simplificam demais na verdade tĂȘm falhas de segurança subjacentes.
 
 ---
 
index fdfe21a264c6ff4eefc980a5c8ad797a3a3b3ef0..802879a53dabd66a75314f8848a94b1b73a9a9bf 100644 (file)
@@ -6,7 +6,7 @@ Agora vamos construir a partir do capĂ­tulo anterior e adicionar as partes que f
 
 Vamos usar os utilitĂĄrios de segurança da **FastAPI** para obter o `username` e a `password`.
 
-OAuth2 especifica que ao usar o "password flow" (fluxo de senha), que estamos usando, o cliente/usuĂĄrio deve enviar os campos `username` e `password` como dados do formulĂĄrio.
+OAuth2 especifica que, ao usar o "fluxo de senha" (que estamos usando), o cliente/usuĂĄrio deve enviar os campos `username` e `password` como dados do formulĂĄrio.
 
 E a especificação diz que os campos devem ser nomeados assim. Portanto, `user-name` ou `email` nĂŁo funcionariam.
 
@@ -29,7 +29,7 @@ Cada â€œscope” Ă© apenas uma string (sem espaços).
 Normalmente sĂŁo usados para declarar permissĂ”es de segurança especĂ­ficas, por exemplo:
 
 * `users:read` ou `users:write` sĂŁo exemplos comuns.
-* `instagram_basic` Ă© usado pelo Facebook e Instagram.
+* `instagram_basic` Ă© usado pelo Facebook / Instagram.
 * `https://www.googleapis.com/auth/drive` Ă© usado pelo Google.
 
 /// note | Nota
@@ -78,7 +78,7 @@ O `OAuth2PasswordRequestForm` nĂŁo Ă© uma classe especial para **FastAPI** como
 
 `OAuth2PasswordBearer` faz com que **FastAPI** saiba que Ă© um esquema de segurança. Portanto, Ă© adicionado dessa forma ao OpenAPI.
 
-Mas `OAuth2PasswordRequestForm` Ă© apenas uma dependĂȘncia de classe que vocĂȘ mesmo poderia ter escrito ou poderia ter declarado os parĂąmetros do `Form` (formulĂĄrio) diretamente.
+Mas `OAuth2PasswordRequestForm` Ă© apenas uma dependĂȘncia de classe que vocĂȘ mesmo poderia ter escrito ou poderia ter declarado os parĂąmetros de `Form` diretamente.
 
 Mas como Ă© um caso de uso comum, ele Ă© fornecido diretamente pelo **FastAPI**, apenas para facilitar.
 
@@ -108,7 +108,7 @@ Neste ponto temos os dados do usuĂĄrio do nosso banco de dados, mas nĂŁo verific
 
 Vamos colocar esses dados primeiro no modelo `UserInDB` do Pydantic.
 
-VocĂȘ nunca deve salvar senhas em texto simples, portanto, usaremos o sistema de hashing de senhas (falsas).
+VocĂȘ nunca deveria salvar senhas em texto simples, portanto, usaremos o sistema (falso) de hashing de senhas.
 
 Se as senhas nĂŁo corresponderem, retornaremos o mesmo erro.
 
@@ -120,7 +120,7 @@ Sempre que vocĂȘ passa exatamente o mesmo conteĂșdo (exatamente a mesma senha),
 
 Mas vocĂȘ nĂŁo pode converter a sequĂȘncia aleatĂłria de caracteres de volta para a senha.
 
-##### Porque usar hashing de senha { #why-use-password-hashing }
+##### Por que usar hashing de senha { #why-use-password-hashing }
 
 Se o seu banco de dados for roubado, o ladrĂŁo nĂŁo terĂĄ as senhas em texto simples dos seus usuĂĄrios, apenas os hashes.
 
@@ -146,7 +146,7 @@ UserInDB(
 
 /// note | Nota
 
-Para uma explicação mais completa de `**user_dict`, verifique [a documentação para **Extra Models**](../extra-models.md#about-user-in-dict).
+Para uma explicação mais completa de `**user_dict`, verifique [a documentação para **Extra Models**](../extra-models.md#about-user-in-model-dump).
 
 ///
 
index 10be4c865c64f54a1a44d71779830b8f3857249c..e715007ebfbd3c93918fd909979905257b079a12 100644 (file)
@@ -4,7 +4,7 @@
 
 Aqui veremos um exemplo usando [SQLModel](https://sqlmodel.tiangolo.com/).
 
-**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**.
+**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
 
@@ -32,7 +32,7 @@ Existe um gerador de projetos oficial com **FastAPI** e **PostgreSQL** incluindo
 
 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 }
+## Instale o `SQLModel` { #install-sqlmodel }
 
 Primeiro, certifique-se de criar seu [ambiente virtual](../virtual-environments.md), ativĂĄ-lo e, em seguida, instalar o `sqlmodel`:
 
@@ -45,13 +45,13 @@ $ pip install sqlmodel
 
 </div>
 
-## Crear o App com um Ăšnico Modelo { #create-the-app-with-a-single-model }
+## Crie 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**.
 
 Depois, vamos melhorĂĄ-lo aumentando a segurança e versatilidade com **mĂșltiplos modelos** abaixo. đŸ€“
 
-### Criar Modelos { #create-models }
+### Crie Modelos { #create-models }
 
 Importe o `SQLModel` e crie um modelo de banco de dados:
 
@@ -71,7 +71,8 @@ Existem algumas diferenças:
 
     O SQLModel saberĂĄ que algo declarado como `str` serĂĄ uma coluna SQL do tipo `TEXT` (ou `VARCHAR`, dependendo do banco de dados).
 
-### Criar um Engine { #create-an-engine }
+### Crie um Engine { #create-an-engine }
+
 Um `engine` SQLModel (por baixo dos panos, ele Ă© na verdade um `engine` do SQLAlchemy) Ă© o que **mantĂ©m as conexĂ”es** com o banco de dados.
 
 VocĂȘ teria **um Ășnico objeto `engine`** para todo o seu cĂłdigo se conectar ao mesmo banco de dados.
@@ -82,13 +83,13 @@ Usar `check_same_thread=False` permite que o FastAPI use o mesmo banco de dados
 
 NĂŁo se preocupe, com a forma como o cĂłdigo estĂĄ estruturado, garantiremos que usamos **uma Ășnica *sessĂŁo* SQLModel por requisição** mais tarde, isso Ă© realmente o que o `check_same_thread` estĂĄ tentando conseguir.
 
-### Criar as Tabelas { #create-the-tables }
+### Crie as Tabelas { #create-the-tables }
 
 Em seguida, adicionamos uma função que usa `SQLModel.metadata.create_all(engine)` para **criar as tabelas** para todos os *modelos de tabela*.
 
 {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[21:22] hl[21:22] *}
 
-### Criar uma DependĂȘncia de SessĂŁo { #create-a-session-dependency }
+### Crie uma DependĂȘncia de SessĂŁo { #create-a-session-dependency }
 
 Uma **`Session`** Ă© o que armazena os **objetos na memĂłria** e acompanha as alteraçÔes necessĂĄrias nos dados, para entĂŁo **usar o `engine`** para se comunicar com o banco de dados.
 
@@ -98,7 +99,7 @@ EntĂŁo, criamos uma dependĂȘncia `Annotated` chamada `SessionDep` para simplific
 
 {* ../../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 }
+### Crie Tabelas de Banco de Dados na Inicialização { #create-database-tables-on-startup }
 
 Vamos criar as tabelas do banco de dados quando o aplicativo for iniciado.
 
@@ -114,7 +115,7 @@ O SQLModel terĂĄ utilitĂĄrios de migração envolvendo o Alembic, mas por enquan
 
 ///
 
-### Criar um Hero { #create-a-hero }
+### Crie um Hero { #create-a-hero }
 
 Como cada modelo SQLModel tambĂ©m Ă© um modelo Pydantic, vocĂȘ pode usĂĄ-lo nas mesmas **anotaçÔes de tipo** que usaria para modelos Pydantic.
 
@@ -126,25 +127,25 @@ Da mesma forma, vocĂȘ pode declarĂĄ-lo como o **tipo de retorno** da função, e
 
 Aqui, usamos a dependĂȘncia `SessionDep` (uma `Session`) para adicionar o novo `Hero` Ă  instĂąncia `Session`, fazer commit das alteraçÔes no banco de dados, atualizar os dados no `hero` e entĂŁo retornĂĄ-lo.
 
-### Ler Heroes { #read-heroes }
+### Leia Heroes { #read-heroes }
 
 Podemos **ler** `Hero`s do banco de dados usando um `select()`. Podemos incluir um `limit` e `offset` para paginar os resultados.
 
 {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[48:55] hl[51:52,54] *}
 
-### Ler um Ăšnico Hero { #read-one-hero }
+### Leia um Ăšnico Hero { #read-one-hero }
 
 Podemos **ler** um Ășnico `Hero`.
 
 {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[58:63] hl[60] *}
 
-### Deletar um Hero { #delete-a-hero }
+### Delete um Hero { #delete-a-hero }
 
 TambĂ©m podemos **deletar** um `Hero`.
 
 {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[66:73] hl[71] *}
 
-### Executar o App { #run-the-app }
+### Execute o App { #run-the-app }
 
 VocĂȘ pode executar o app:
 
@@ -164,19 +165,19 @@ EntĂŁo, vĂĄ para a interface `/docs`, vocĂȘ verĂĄ que o **FastAPI** estĂĄ usando
 <img src="/img/tutorial/sql-databases/image01.png">
 </div>
 
-## Atualizar o App com MĂșltiplos Modelos { #update-the-app-with-multiple-models }
+## Atualize o App com MĂșltiplos Modelos { #update-the-app-with-multiple-models }
 
 Agora vamos **refatorar** este app um pouco para aumentar a **segurança** e **versatilidade**.
 
-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. đŸ˜±
+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. đŸ˜±
 
-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**.
+NĂŁo deverĂ­amos deixar isso acontecer, eles poderiam sobrescrever um `id` que jĂĄ atribuĂ­mos no banco de dados. Decidir o `id` deve ser feito pelo **backend** ou pelo **banco de dados**, **nĂŁo pelo cliente**.
 
 AlĂ©m disso, criamos um `secret_name` para o hero, mas atĂ© agora estamos retornando ele em todos os lugares, isso nĂŁo Ă© muito **secreto**... đŸ˜…
 
 Vamos corrigir essas coisas adicionando alguns **modelos extras**. Aqui Ă© onde o SQLModel vai brilhar. âœš
 
-### Criar MĂșltiplos Modelos { #create-multiple-models }
+### Crie MĂșltiplos Modelos { #create-multiple-models }
 
 No **SQLModel**, qualquer classe de modelo que tenha `table=True` Ă© um **modelo de tabela**.
 
@@ -277,7 +278,7 @@ Os campos de `HeroUpdate` sĂŁo:
 
 {* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[7:28] hl[25:28] *}
 
-### Criar com `HeroCreate` e retornar um `HeroPublic` { #create-with-herocreate-and-return-a-heropublic }
+### Crie com `HeroCreate` e retorne um `HeroPublic` { #create-with-herocreate-and-return-a-heropublic }
 
 Agora que temos **mĂșltiplos modelos**, podemos atualizar as partes do app que os utilizam.
 
@@ -299,19 +300,19 @@ Ao declarĂĄ-lo no `response_model`, estamos dizendo ao **FastAPI** para fazer o
 
 ///
 
-### Ler Heroes com `HeroPublic` { #read-heroes-with-heropublic }
+### Leia Heroes com `HeroPublic` { #read-heroes-with-heropublic }
 
 Podemos fazer o mesmo que antes para **ler** `Hero`s, novamente, usamos `response_model=list[HeroPublic]` para garantir que os dados sejam validados e serializados corretamente.
 
 {* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[65:72] hl[65] *}
 
-### Ler Um Hero com `HeroPublic` { #read-one-hero-with-heropublic }
+### Leia Um Hero com `HeroPublic` { #read-one-hero-with-heropublic }
 
 Podemos **ler** um Ășnico herĂłi:
 
 {* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[75:80] hl[77] *}
 
-### Atualizar um Hero com `HeroUpdate` { #update-a-hero-with-heroupdate }
+### Atualize um Hero com `HeroUpdate` { #update-a-hero-with-heroupdate }
 
 Podemos **atualizar um hero**. Para isso, usamos uma operação HTTP `PATCH`.
 
@@ -321,7 +322,7 @@ Em seguida, usamos `hero_db.sqlmodel_update(hero_data)` para atualizar o `hero_d
 
 {* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[83:93] hl[83:84,88:89] *}
 
-### Deletar um Hero Novamente { #delete-a-hero-again }
+### Delete um Hero Novamente { #delete-a-hero-again }
 
 **Deletar** um hero permanece praticamente o mesmo.
 
@@ -329,7 +330,7 @@ NĂŁo vamos satisfazer o desejo de refatorar tudo neste aqui. đŸ˜…
 
 {* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[96:103] hl[101] *}
 
-### Executar o App Novamente { #run-the-app-again }
+### Execute o App Novamente { #run-the-app-again }
 
 VocĂȘ pode executar o app novamente:
 
index e9150facd9897eaf1abe5b48cb2ac15fa0c06bd2..4e8d4319a64a26c4bd9132fdaca98781d01f6420 100644 (file)
@@ -2,6 +2,14 @@
 
 VocĂȘ pode servir arquivos estĂĄticos automaticamente a partir de um diretĂłrio usando `StaticFiles`.
 
+/// tip | Dica
+
+Se vocĂȘ precisar hospedar um frontend, use `app.frontend()` em vez disso, leia sobre isso em [Frontend](frontend.md).
+
+`app.frontend()` usa `StaticFiles` por baixo, com vĂĄrias vantagens adicionais para frontends, como lidar com roteamento do lado do cliente.
+
+///
+
 ## Use `StaticFiles` { #use-staticfiles }
 
 * Importe `StaticFiles`.
index e185102aea071effba5bfb9cf4ac3ec9e6c686f9..9d94cddcd42930f0beb333626d10ead59d023d81 100644 (file)
@@ -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) no tutorial avançado.
+Se vocĂȘ quiser chamar funçÔes `async` em seus testes alĂ©m de enviar requests Ă  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.
 
 ///
 
@@ -94,6 +94,7 @@ Como esse arquivo estĂĄ no mesmo pacote, vocĂȘ pode usar importaçÔes relativas
 
 {* ../../docs_src/app_testing/app_a_py310/test_main.py hl[3] *}
 
+
 ...e ter o cĂłdigo para os testes como antes.
 
 ## Testando: exemplo estendido { #testing-extended-example }
@@ -112,13 +113,13 @@ Vamos continuar com a mesma estrutura de arquivo de antes:
 â”‚   â””── test_main.py
 ```
 
-Digamos que agora o arquivo `main.py` com sua aplicação **FastAPI** tenha algumas outras **operaçÔes de rotas**.
+Digamos que agora o arquivo `main.py` com sua aplicação **FastAPI** tenha algumas outras **operaçÔes de rota**.
 
 Ele tem uma operação `GET` que pode retornar um erro.
 
 Ele tem uma operação `POST` que pode retornar vĂĄrios erros.
 
-Ambas as *operaçÔes de rotas* requerem um cabeçalho `X-Token`.
+Ambas as *operaçÔes de rota* requerem um cabeçalho `X-Token`.
 
 {* ../../docs_src/app_testing/app_b_an_py310/main.py *}
 
@@ -128,6 +129,7 @@ VocĂȘ pode entĂŁo atualizar `test_main.py` com os testes estendidos:
 
 {* ../../docs_src/app_testing/app_b_an_py310/test_main.py *}
 
+
 Sempre que vocĂȘ precisar que o cliente passe informaçÔes na requisição e nĂŁo souber como, vocĂȘ pode pesquisar (no Google) como fazer isso no `httpx`, ou atĂ© mesmo como fazer isso com `requests`, jĂĄ que o design do HTTPX Ă© baseado no design do Requests.
 
 Depois Ă© sĂł fazer o mesmo nos seus testes.
@@ -146,7 +148,7 @@ Para mais informaçÔes sobre como passar dados para o backend (usando `httpx` 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).
+Se vocĂȘ tiver um modelo Pydantic em seu teste e quiser enviar seus dados para a aplicação durante o teste, poderĂĄ usar o `jsonable_encoder` descrito em [Codificador compatĂ­vel com JSON](encoder.md).
 
 ///
 
index 2459196081a5b50fb035c14266eccb4fad500da5..121032d6c156ee0316b50dd57af18f2b9249af2b 100644 (file)
@@ -26,7 +26,7 @@ Se vocĂȘ estiver pronto para adotar uma **ferramenta que gerencia tudo** para vo
 
 ///
 
-## Criar um Projeto { #create-a-project }
+## Crie um Projeto { #create-a-project }
 
 Primeiro, crie um diretĂłrio para seu projeto.
 
@@ -212,7 +212,7 @@ Se ele mostrar o binĂĄrio `python` em `.venv\Scripts\python`, dentro do seu proj
 
 ////
 
-## Atualizar `pip` { #upgrade-pip }
+## Atualize `pip` { #upgrade-pip }
 
 /// tip | Dica
 
@@ -262,7 +262,7 @@ Esse comando instalarĂĄ o pip caso ele ainda nĂŁo esteja instalado e tambĂ©m gar
 
 ///
 
-## Adicionar `.gitignore` { #add-gitignore }
+## Adicione `.gitignore` { #add-gitignore }
 
 Se vocĂȘ estiver usando **Git** (vocĂȘ deveria), adicione um arquivo `.gitignore` para excluir tudo em seu `.venv` do Git.
 
@@ -302,7 +302,7 @@ Esse comando criarĂĄ um arquivo `.gitignore` com o conteĂșdo:
 
 ///
 
-## Instalar Pacotes { #install-packages }
+## Instale Pacotes { #install-packages }
 
 ApĂłs ativar o ambiente, vocĂȘ pode instalar pacotes nele.
 
@@ -314,7 +314,7 @@ Se precisar atualizar uma versĂŁo ou adicionar um novo pacote, vocĂȘ **farĂĄ iss
 
 ///
 
-### Instalar pacotes diretamente { #install-packages-directly }
+### Instale pacotes diretamente { #install-packages-directly }
 
 Se estiver com pressa e nĂŁo quiser usar um arquivo para declarar os requisitos de pacote do seu projeto, vocĂȘ pode instalĂĄ-los diretamente.
 
@@ -353,7 +353,7 @@ $ uv pip install "fastapi[standard]"
 
 ////
 
-### Instalar a partir de `requirements.txt` { #install-from-requirements-txt }
+### Instale a partir de `requirements.txt` { #install-from-requirements-txt }
 
 Se vocĂȘ tiver um `requirements.txt`, agora poderĂĄ usĂĄ-lo para instalar seus pacotes.
 
@@ -425,7 +425,7 @@ Normalmente, vocĂȘ sĂł precisa fazer isso **uma vez**, ao criar o ambiente virtu
 
 ///
 
-## Desativar o ambiente virtual { #deactivate-the-virtual-environment }
+## Desative o ambiente virtual { #deactivate-the-virtual-environment }
 
 Quando terminar de trabalhar no seu projeto, vocĂȘ pode **desativar** o ambiente virtual.
 
@@ -768,7 +768,7 @@ C:\Users\user\code\awesome-project\.venv\Scripts\python
 
 Isso significa que o programa `python` que serĂĄ usado Ă© aquele **no ambiente virtual**.
 
-vocĂȘ usa `which` no Linux e macOS e `Get-Command` no Windows PowerShell.
+VocĂȘ usa `which` no Linux e macOS e `Get-Command` no Windows PowerShell.
 
 A maneira como esse comando funciona Ă© que ele vai e verifica na variĂĄvel de ambiente `PATH`, passando por **cada caminho em ordem**, procurando pelo programa chamado `python`. Uma vez que ele o encontre, ele **mostrarĂĄ o caminho** para esse programa.
 
@@ -811,7 +811,7 @@ $ cd ~/code/prisoner-of-azkaban
 
 $ python main.py
 
-// Erro ao importar o Sirius, ele nĂŁo estĂĄ instalado đŸ˜±
+// Erro ao importar sirius, ele nĂŁo estĂĄ instalado đŸ˜±
 Traceback (most recent call last):
     File "main.py", line 1, in <module>
         import sirius
@@ -861,4 +861,4 @@ Quando estiver pronto e quiser usar uma ferramenta para **gerenciar todo o proje
 
 Se vocĂȘ leu e entendeu tudo isso, agora **vocĂȘ sabe muito mais** sobre ambientes virtuais do que muitos desenvolvedores por aĂ­. đŸ€“
 
-Saber esses detalhes provavelmente serĂĄ Ăștil no futuro, quando vocĂȘ estiver depurando algo que parece complexo, mas vocĂȘ saberĂĄ **como tudo funciona**. đŸ˜Ž
+Saber esses detalhes provavelmente serĂĄ Ăștil no futuro, quando vocĂȘ estiver depurando algo que parece complexo, mas vocĂȘ saberĂĄ **como tudo funciona por baixo**. đŸ˜Ž