* **Rápido**: alta performance, equivalente a **NodeJS** e **Go** (graças ao Starlette e Pydantic). [Um dos frameworks mais rápidos disponíveis](#performance).
* **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 _IDEs_. <abbrtitle="também conhecido como_auto-complete_,_autocompletion_,_IntelliSense_">_Auto-Complete_</abbr> em todos os lugares. Menos tempo debugando.
* **Intuitivo**: Grande suporte a _IDEs_. <abbrtitle="também conhecido como autocompletar, preenchimento automático, IntelliSense">Preenchimento automático</abbr> em todos os lugares. Menos tempo debugando.
* **Fácil**: Projetado para ser fácil de aprender e usar. Menos tempo lendo documentação.
* **Enxuto**: Minimize duplicação de código. Múltiplos recursos para cada declaração de parâmetro. Menos bugs.
* **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: <ahref="https://github.com/OAI/OpenAPI-Specification"class="external-link"target="_blank">OpenAPI</a> (anteriormente conhecido como Swagger) e <ahref="https://json-schema.org/"class="external-link"target="_blank">_JSON Schema_</a>.
* **Baseado em padrões**: Baseado em (e totalmente compatível com) os padrões abertos para APIs: <ahref="https://github.com/OAI/OpenAPI-Specification"class="external-link"target="_blank">OpenAPI</a> (anteriormente conhecido como Swagger) e <ahref="https://json-schema.org/"class="external-link"target="_blank">JSON Schema</a>.
<small>* estimativas baseadas em testes realizados com equipe interna de desenvolvimento, construindo aplicações em produção.</small>
"*[...] Estou usando **FastAPI** muito esses dias. [...] Estou na verdade planejando utilizar ele em todos os times de **serviços _Machine Learning_ na Microsoft**. Alguns deles estão sendo integrados no _core_ do produto **Windows** e alguns produtos **Office**.*"
@ -111,24 +111,24 @@ Os recursos chave são:
---
## **Typer**, o FastAPI das interfaces de linhas de comando
## **Typer**, o FastAPI das interfaces de linhas de comando { #typer-the-fastapi-of-clis }
Se você estiver construindo uma aplicação <abbrtitle="Command Line Interface">_CLI_</abbr> para ser utilizada em um terminal ao invés de uma aplicação web, dê uma olhada no <ahref="https://typer.tiangolo.com/"class="external-link"target="_blank">**Typer**</a>.
Se você estiver construindo uma aplicação <abbrtitle="Command Line Interface – Interface de Linha de Comando">CLI</abbr> para ser utilizada em um terminal ao invés de uma aplicação web, dê uma olhada no <ahref="https://typer.tiangolo.com/"class="external-link"target="_blank">**Typer**</a>.
**Typer** é o irmão menor do FastAPI. E seu propósito é ser o **FastAPI das _CLIs_**. ⌨️ 🚀
## Requisitos
## Requisitos { #requirements }
FastAPI está nos ombros de gigantes:
* <ahref="https://www.starlette.dev/"class="external-link"target="_blank">Starlette</a> para as partes web.
* <ahref="https://docs.pydantic.dev/"class="external-link"target="_blank">Pydantic</a> para a parte de dados.
## Instalação
## Instalação { #installation }
Crie e ative um <ahref="https://fastapi.tiangolo.com/pt/virtual-environments/"class="external-link"target="_blank">ambiente virtual</a>, e então instale o FastAPI:
Crie e ative um <ahref="https://fastapi.tiangolo.com/pt/virtual-environments/"class="external-link"target="_blank">ambiente virtual</a> e então instale o FastAPI:
Se você não sabe, verifique a seção _"Com pressa?"_ sobre <ahref="https://fastapi.tiangolo.com/pt/async/#com-pressa"target="_blank">`async` e `await` nas docs</a>.
Se você não sabe, verifique a seção _"Com pressa?"_ sobre <ahref="https://fastapi.tiangolo.com/pt/async/#in-a-hurry"target="_blank">`async` e `await` nas docs</a>.
</details>
### Rode
### Rode { #run-it }
Rode o servidor com:
@ -237,7 +237,7 @@ Você pode ler mais sobre isso na <a href="https://fastapi.tiangolo.com/pt/fasta
</details>
### Verifique
### Verifique { #check-it }
Abra seu navegador em <ahref="http://127.0.0.1:8000/items/5?q=somequery"class="external-link"target="_blank">http://127.0.0.1:8000/items/5?q=somequery</a>.
@ -254,7 +254,7 @@ Você acabou de criar uma API que:
* A _rota_`/items/{item_id}` tem um _parâmetro de rota_`item_id` que deve ser um `int`.
* A _rota_`/items/{item_id}` tem um _parâmetro query_`q``str` opcional.
### Documentação Interativa da API
### Documentação Interativa da API { #interactive-api-docs }
Agora vá para <ahref="http://127.0.0.1:8000/docs"class="external-link"target="_blank">http://127.0.0.1:8000/docs</a>.
@ -262,7 +262,7 @@ Você verá a documentação automática interativa da API (fornecida por <a hre
Resumindo, você declara **uma vez** os tipos dos parâmetros, corpo etc. como parâmetros de função.
@ -362,7 +362,7 @@ item: Item
* Validação de dados:
* Erros automáticos e claros quando o dado é inválido.
* Validação até para objetos JSON profundamente aninhados.
* <abbrtitle="também conhecido como: serialization, parsing, marshalling">Conversão</abbr> de dados de entrada: vindo da rede para dados e tipos Python. Consegue ler:
* <abbrtitle="também conhecido como: serialização, parsing, marshalling">Conversão</abbr> de dados de entrada: vindo da rede para dados e tipos Python. Consegue ler:
* JSON.
* Parâmetros de rota.
* Parâmetros de _query_ .
@ -370,7 +370,7 @@ item: Item
* Cabeçalhos.
* Formulários.
* Arquivos.
* <abbrtitle="também conhecido como: serialization, parsing, marshalling">Conversão</abbr> de dados de saída de tipos e dados Python para dados de rede (como JSON):
* <abbrtitle="também conhecido como: serialização, parsing, marshalling">Conversão</abbr> de dados de saída de tipos e dados Python para dados de rede (como JSON):
@ -390,7 +390,7 @@ Voltando ao código do exemplo anterior, **FastAPI** irá:
* Verificar se existe um parâmetro de _query_ opcional nomeado como `q` (como em `http://127.0.0.1:8000/items/foo?q=somequery`) para requisições `GET`.
* Como o parâmetro `q` é declarado com `= None`, ele é opcional.
* Sem o `None` ele poderia ser obrigatório (como o corpo no caso de `PUT`).
* Para requisições `PUT` para `/items/{item_id}`, lerá o corpo como JSON e:
* Para requisições `PUT` para `/items/{item_id}`, lerá o corpo como JSON:
* Verifica que tem um atributo obrigatório `name` que deve ser `str`.
* Verifica que tem um atributo obrigatório `price` que deve ser `float`.
* Verifica que tem an atributo opcional `is_offer`, que deve ser `bool`, se presente.
@ -444,18 +444,17 @@ Para um exemplo mais completo incluindo mais recursos, veja <a href="https://fas
* **Cookie Sessions**
* ...e mais.
## Performance
## Performance { #performance }
Testes de performance da _Independent TechEmpower_ mostram aplicações **FastAPI** rodando sob Uvicorn como <ahref="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7"class="external-link"target="_blank">um dos _frameworks_ Python mais rápidos disponíveis</a>, somente atrás de Starlette e Uvicorn (utilizados internamente pelo FastAPI). (*)
Para entender mais sobre performance, veja a seção <ahref="https://fastapi.tiangolo.com/pt/benchmarks/"class="internal-link"target="_blank">Comparações</a>.
Quando você instala o FastAPI com `pip install "fastapi[standard]"`, ele vêm com o grupo `standard` (padrão) de dependências opcionais:
@ -467,18 +466,23 @@ Utilizado pelo Starlette:
* <ahref="https://www.python-httpx.org"target="_blank"><code>httpx</code></a> - Obrigatório caso você queira utilizar o `TestClient`.
* <ahref="https://jinja.palletsprojects.com"target="_blank"><code>jinja2</code></a> - Obrigatório se você quer utilizar a configuração padrão de templates.
* <ahref="https://github.com/Kludex/python-multipart"target="_blank"><code>python-multipart</code></a> - Obrigatório se você deseja suporte a <abbrtitle="converting the string that comes from an HTTP request into Python data">"parsing"</abbr> de formulário, com `request.form()`.
* <ahref="https://github.com/Kludex/python-multipart"target="_blank"><code>python-multipart</code></a> - Obrigatório se você deseja suporte a <abbrtitle="convertendo a string que vem de uma requisição HTTP em dados Python">"parsing"</abbr> de formulário, com `request.form()`.
Utilizado pelo FastAPI / Starlette:
Utilizado pelo FastAPI:
* <ahref="https://www.uvicorn.dev"target="_blank"><code>uvicorn</code></a> - para o servidor que carrega e serve a sua aplicação. Isto inclui `uvicorn[standard]`, que inclui algumas dependências (e.g. `uvloop`) necessárias para servir em alta performance.
* `fastapi-cli` - que disponibiliza o comando `fastapi`.
* `fastapi-cli[standard]` - que disponibiliza o comando `fastapi`.
* Isso inclui `fastapi-cloud-cli`, que permite implantar sua aplicação FastAPI na <ahref="https://fastapicloud.com"class="external-link"target="_blank">FastAPI Cloud</a>.
### Sem as dependências `standard`
### Sem as dependências `standard` { #without-standard-dependencies }
Se você não deseja incluir as dependências opcionais `standard`, você pode instalar utilizando `pip install fastapi` ao invés de `pip install "fastapi[standard]"`.
### Dpendências opcionais adicionais
### Sem o `fastapi-cloud-cli` { #without-fastapi-cloud-cli }
Se você quiser instalar o FastAPI com as dependências padrão, mas sem o `fastapi-cloud-cli`, você pode instalar com `pip install "fastapi[standard-no-fastapi-cloud-cli]"`.