1<p align="center"> 2 <a href="https://fastapi.tiangolo.com"><img src="https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png" alt="FastAPI"></a> 3</p> 4<p align="center"> 5 <em>Framework FastAPI, alta performance, fácil de aprender, fácil de codar, pronto para produção</em> 6</p> 7<p align="center"> 8<a href="https://github.com/tiangolo/fastapi/actions?query=workflow%3ATest" target="_blank"> 9 <img src="https://github.com/tiangolo/fastapi/workflows/Test/badge.svg" alt="Test"> 10</a> 11<a href="https://codecov.io/gh/tiangolo/fastapi" target="_blank"> 12 <img src="https://img.shields.io/codecov/c/github/tiangolo/fastapi?color=%2334D058" alt="Coverage"> 13</a> 14<a href="https://pypi.org/project/fastapi" target="_blank"> 15 <img src="https://img.shields.io/pypi/v/fastapi?color=%2334D058&label=pypi%20package" alt="Package version"> 16</a> 17</p> 18 19--- 20 21**Documentação**: <a href="https://fastapi.tiangolo.com" target="_blank">https://fastapi.tiangolo.com</a> 22 23**Código fonte**: <a href="https://github.com/tiangolo/fastapi" target="_blank">https://github.com/tiangolo/fastapi</a> 24 25--- 26 27FastAPI é um moderno e rápido (alta performance) _framework web_ para construção de APIs com Python 3.6 ou superior, baseado nos _type hints_ padrões do Python. 28 29Os recursos chave são: 30 31* **Rápido**: alta performance, equivalente a **NodeJS** e **Go** (graças ao Starlette e Pydantic). [Um dos frameworks mais rápidos disponíveis](#performance). 32* **Rápido para codar**: Aumenta a velocidade para desenvolver recursos entre 200% a 300%. * 33* **Poucos bugs**: Reduz cerca de 40% de erros induzidos por humanos (desenvolvedores). * 34* **Intuitivo**: Grande suporte a _IDEs_. <abbr title="também conhecido como _auto-complete_, _autocompletion_, _IntelliSense_">_Auto-Complete_</abbr> em todos os lugares. Menos tempo debugando. 35* **Fácil**: Projetado para ser fácil de aprender e usar. Menos tempo lendo documentação. 36* **Enxuto**: Minimize duplicação de código. Múltiplos recursos para cada declaração de parâmetro. Menos bugs. 37* **Robusto**: Tenha código pronto para produção. E com documentação interativa automática. 38* **Baseado em padrões**: Baseado em (e totalmente compatível com) os padrões abertos para APIs: <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a> (anteriormente conhecido como Swagger) e <a href="https://json-schema.org/" class="external-link" target="_blank">_JSON Schema_</a>. 39 40<small>* estimativas baseadas em testes realizados com equipe interna de desenvolvimento, construindo aplicações em produção.</small> 41 42## Patrocinadores Ouro 43 44<!-- sponsors --> 45 46{% if sponsors %} 47{% for sponsor in sponsors.gold -%} 48<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a> 49{% endfor -%} 50{%- for sponsor in sponsors.silver -%} 51<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a> 52{% endfor %} 53{% endif %} 54 55<!-- /sponsors --> 56 57<a href="https://fastapi.tiangolo.com/pt/fastapi-people/#patrocinadores" class="external-link" target="_blank">Outros patrocinadores</a> 58 59## Opiniões 60 61"*[...] 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**.*" 62 63<div style="text-align: right; margin-right: 10%;">Kabir Khan - <strong>Microsoft</strong> <a href="https://github.com/tiangolo/fastapi/pull/26" target="_blank"><small>(ref)</small></a></div> 64 65--- 66 67"*Estou extremamente entusiasmado com o **FastAPI**. É tão divertido!*" 68 69<div style="text-align: right; margin-right: 10%;">Brian Okken - <strong><a href="https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855" target="_blank">Python Bytes</a> podcaster</strong> <a href="https://twitter.com/brianokken/status/1112220079972728832" target="_blank"><small>(ref)</small></a></div> 70 71--- 72 73"*Honestamente, o que você construiu parece super sólido e rebuscado. De muitas formas, eu queria que o **Hug** fosse assim - é realmente inspirador ver alguém que construiu ele.*" 74 75<div style="text-align: right; margin-right: 10%;">Timothy Crosley - <strong>criador do<a href="https://www.hug.rest/" target="_blank">Hug</a></strong> <a href="https://news.ycombinator.com/item?id=19455465" target="_blank"><small>(ref)</small></a></div> 76 77--- 78 79"*Se você está procurando aprender um **_framework_ moderno** para construir aplicações _REST_, dê uma olhada no **FastAPI** [...] É rápido, fácil de usar e fácil de aprender [...]*" 80 81"*Nós trocamos nossas **APIs** por **FastAPI** [...] Acredito que vocês gostarão dele [...]*" 82 83<div style="text-align: right; margin-right: 10%;">Ines Montani - Matthew Honnibal - <strong>fundadores da <a href="https://explosion.ai" target="_blank">Explosion AI</a> - criadores da <a href="https://spacy.io" target="_blank">spaCy</a></strong> <a href="https://twitter.com/_inesmontani/status/1144173225322143744" target="_blank"><small>(ref)</small></a> - <a href="https://twitter.com/honnibal/status/1144031421859655680" target="_blank"><small>(ref)</small></a></div> 84 85--- 86 87"*Nós adotamos a biblioteca **FastAPI** para criar um servidor **REST** que possa ser chamado para obter **predições**. [para o Ludwig]*" 88 89<div style="text-align: right; margin-right: 10%;">Piero Molino, Yaroslav Dudin e Sai Sumanth Miryala - <strong>Uber</strong> <a href="https://eng.uber.com/ludwig-v0-2/" target="_blank"><small>(ref)</small></a></div> 90 91--- 92 93## **Typer**, o FastAPI das interfaces de linhas de comando 94 95<a href="https://typer.tiangolo.com" target="_blank"><img src="https://typer.tiangolo.com/img/logo-margin/logo-margin-vector.svg" style="width: 20%;"></a> 96 97Se você estiver construindo uma aplicação <abbr title="Command Line Interface">_CLI_</abbr> para ser utilizada em um terminal ao invés de uma aplicação web, dê uma olhada no <a href="https://typer.tiangolo.com/" class="external-link" target="_blank">**Typer**</a>. 98 99**Typer** é o irmão menor do FastAPI. E seu propósito é ser o **FastAPI das _CLIs_**. ⌨️ 100 101## Requisitos 102 103Python 3.6+ 104 105FastAPI está nos ombros de gigantes: 106 107* <a href="https://www.starlette.io/" class="external-link" target="_blank">Starlette</a> para as partes web. 108* <a href="https://pydantic-docs.helpmanual.io/" class="external-link" target="_blank">Pydantic</a> para a parte de dados. 109 110## Instalação 111 112<div class="termy"> 113 114```console 115$ pip install fastapi 116 117---> 100% 118``` 119 120</div> 121 122Você também precisará de um servidor ASGI para produção, tal como <a href="https://www.uvicorn.org" class="external-link" target="_blank">Uvicorn</a> ou <a href="https://gitlab.com/pgjones/hypercorn" class="external-link" target="_blank">Hypercorn</a>. 123 124<div class="termy"> 125 126```console 127$ pip install uvicorn[standard] 128 129---> 100% 130``` 131 132</div> 133 134## Exemplo 135 136### Crie 137 138* Crie um arquivo `main.py` com: 139 140```Python 141from typing import Optional 142 143from fastapi import FastAPI 144 145app = FastAPI() 146 147 148@app.get("/") 149def read_root(): 150 return {"Hello": "World"} 151 152 153@app.get("/items/{item_id}") 154def read_item(item_id: int, q: Optional[str] = None): 155 return {"item_id": item_id, "q": q} 156``` 157 158<details markdown="1"> 159<summary>Ou use <code>async def</code>...</summary> 160 161Se seu código utiliza `async` / `await`, use `async def`: 162 163```Python hl_lines="9 14" 164from typing import Optional 165 166from fastapi import FastAPI 167 168app = FastAPI() 169 170 171@app.get("/") 172async def read_root(): 173 return {"Hello": "World"} 174 175 176@app.get("/items/{item_id}") 177async def read_item(item_id: int, q: Optional[str] = None): 178 return {"item_id": item_id, "q": q} 179``` 180 181**Nota**: 182 183Se você não sabe, verifique a seção _"In a hurry?"_ sobre <a href="https://fastapi.tiangolo.com/async/#in-a-hurry" target="_blank">`async` e `await` nas docs</a>. 184 185</details> 186 187### Rode 188 189Rode o servidor com: 190 191<div class="termy"> 192 193```console 194$ uvicorn main:app --reload 195 196INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) 197INFO: Started reloader process [28720] 198INFO: Started server process [28722] 199INFO: Waiting for application startup. 200INFO: Application startup complete. 201``` 202 203</div> 204 205<details markdown="1"> 206<summary>Sobre o comando <code>uvicorn main:app --reload</code>...</summary> 207 208O comando `uvicorn main:app` se refere a: 209 210* `main`: o arquivo `main.py` (o "módulo" Python). 211* `app`: o objeto criado dentro de `main.py` com a linha `app = FastAPI()`. 212* `--reload`: faz o servidor recarregar após mudanças de código. Somente faça isso para desenvolvimento. 213 214</details> 215 216### Verifique 217 218Abra seu navegador em <a href="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>. 219 220Você verá a resposta JSON como: 221 222```JSON 223{"item_id": 5, "q": "somequery"} 224``` 225 226Você acabou de criar uma API que: 227 228* Recebe requisições HTTP nas _rotas_ `/` e `/items/{item_id}`. 229* Ambas _rotas_ fazem <em>operações</em> `GET` (também conhecido como _métodos_ HTTP). 230* A _rota_ `/items/{item_id}` tem um _parâmetro de rota_ `item_id` que deve ser um `int`. 231* A _rota_ `/items/{item_id}` tem um _parâmetro query_ `q` `str` opcional. 232 233### Documentação Interativa da API 234 235Agora vá para <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>. 236 237Você verá a documentação automática interativa da API (fornecida por <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a>): 238 239![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) 240 241### Documentação Alternativa da API 242 243E agora, vá para <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>. 244 245Você verá a documentação automática alternativa (fornecida por <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a>): 246 247![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) 248 249## Evoluindo o Exemplo 250 251Agora modifique o arquivo `main.py` para receber um corpo para uma requisição `PUT`. 252 253Declare o corpo utilizando tipos padrão Python, graças ao Pydantic. 254 255```Python hl_lines="4 9-12 25-27" 256from fastapi import FastAPI 257from pydantic import BaseModel 258 259app = FastAPI() 260 261 262class Item(BaseModel): 263 name: str 264 price: float 265 is_offer: Optional[bool] = None 266 267 268@app.get("/") 269def read_root(): 270 return {"Hello": "World"} 271 272 273@app.get("/items/{item_id}") 274def read_item(item_id: int, q: Optional[str] = None): 275 return {"item_id": item_id, "q": q} 276 277 278@app.put("/items/{item_id}") 279def update_item(item_id: int, item: Item): 280 return {"item_name": item.name, "item_id": item_id} 281``` 282 283O servidor deverá recarregar automaticamente (porquê você adicionou `--reload` ao comando `uvicorn` acima). 284 285### Evoluindo a Documentação Interativa da API 286 287Agora vá para <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>. 288 289* A documentação interativa da API será automaticamente atualizada, incluindo o novo corpo: 290 291![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) 292 293* Clique no botão "Try it out", ele permiirá que você preencha os parâmetros e interaja diretamente com a API: 294 295![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) 296 297* Então clique no botão "Execute", a interface do usuário irá se comunicar com a API, enviar os parâmetros, pegar os resultados e mostrá-los na tela: 298 299![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) 300 301### Evoluindo a Documentação Alternativa da API 302 303E agora, vá para <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a>. 304 305* A documentação alternativa também irá refletir o novo parâmetro da _query_ e o corpo: 306 307![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) 308 309### Recapitulando 310 311Resumindo, você declara **uma vez** os tipos dos parâmetros, corpo etc. como parâmetros de função. 312 313Você faz com tipos padrão do Python moderno. 314 315Você não terá que aprender uma nova sintaxe, métodos ou classes de uma biblioteca específica etc. 316 317Apenas **Python 3.6+** padrão. 318 319Por exemplo, para um `int`: 320 321```Python 322item_id: int 323``` 324 325ou para um modelo mais complexo, `Item`: 326 327```Python 328item: Item 329``` 330 331...e com essa única declaração você tem: 332 333* Suporte ao Editor, incluindo: 334 * Completação. 335 * Verificação de tipos. 336* Validação de dados: 337 * Erros automáticos e claros quando o dado é inválido. 338 * Validação até para objetos JSON profundamente aninhados. 339* <abbr title="também conhecido como: serialization, parsing, marshalling">Conversão</abbr> de dados de entrada: vindo da rede para dados e tipos Python. Consegue ler: 340 * JSON. 341 * Parâmetros de rota. 342 * Parâmetros de _query_ . 343 * _Cookies_. 344 * Cabeçalhos. 345 * Formulários. 346 * Arquivos. 347* <abbr title="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): 348 * Converte tipos Python (`str`, `int`, `float`, `bool`, `list` etc). 349 * Objetos `datetime`. 350 * Objetos `UUID`. 351 * Modelos de Banco de Dados. 352 * ...e muito mais. 353* Documentação interativa automática da API, incluindo 2 alternativas de interface de usuário: 354 * Swagger UI. 355 * ReDoc. 356 357--- 358 359Voltando ao código do exemplo anterior, **FastAPI** irá: 360 361* Validar que existe um `item_id` na rota para requisições `GET` e `PUT`. 362* Validar que `item_id` é do tipo `int` para requisições `GET` e `PUT`. 363 * Se não é validado, o cliente verá um útil, claro erro. 364* 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`. 365 * Como o parâmetro `q` é declarado com `= None`, ele é opcional. 366 * Sem o `None` ele poderia ser obrigatório (como o corpo no caso de `PUT`). 367* Para requisições `PUT` para `/items/{item_id}`, lerá o corpo como JSON e: 368 * Verifica que tem um atributo obrigatório `name` que deve ser `str`. 369 * Verifica que tem um atributo obrigatório `price` que deve ser `float`. 370 * Verifica que tem an atributo opcional `is_offer`, que deve ser `bool`, se presente. 371 * Tudo isso também funciona para objetos JSON profundamente aninhados. 372* Converter de e para JSON automaticamente. 373* Documentar tudo com OpenAPI, que poderá ser usado por: 374 * Sistemas de documentação interativos. 375 * Sistemas de clientes de geração de código automáticos, para muitas linguagens. 376* Fornecer diretamente 2 interfaces _web_ de documentação interativa. 377 378--- 379 380Nós arranhamos apenas a superfície, mas você já tem idéia de como tudo funciona. 381 382Experimente mudar a seguinte linha: 383 384```Python 385 return {"item_name": item.name, "item_id": item_id} 386``` 387 388...de: 389 390```Python 391 ... "item_name": item.name ... 392``` 393 394...para: 395 396```Python 397 ... "item_price": item.price ... 398``` 399 400...e veja como seu editor irá auto-completar os atributos e saberá os tipos: 401 402![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) 403 404Para um exemplo mais completo incluindo mais recursos, veja <a href="https://fastapi.tiangolo.com/tutorial/">Tutorial - Guia do Usuário</a>. 405 406**Alerta de Spoiler**: o tutorial - guia do usuário inclui: 407 408* Declaração de **parâmetetros** de diferentes lugares como: **cabeçalhos**, **cookies**, **campos de formulários** e **arquivos**. 409* Como configurar **Limitações de Validação** como `maximum_length` ou `regex`. 410* Um poderoso e fácil de usar sistema de **<abbr title="também conhecido como componentes, recursos, fornecedores, serviços, injetáveis">Injeção de Dependência</abbr>**. 411* Segurança e autenticação, incluindo suporte para **OAuth2** com autenticação **JWT tokens** e **HTTP Basic**. 412* Técnicas mais avançadas (mas igualmente fáceis) para declaração de **modelos JSON profundamente aninhados** (graças ao Pydantic). 413* Muitos recursos extras (graças ao Starlette) como: 414 * **WebSockets** 415 * **GraphQL** 416 * testes extrememamente fáceis baseados em `requests` e `pytest` 417 * **CORS** 418 * **Cookie Sessions** 419 * ...e mais. 420 421## Performance 422 423Testes de performance da _Independent TechEmpower_ mostram aplicações **FastAPI** rodando sob Uvicorn como <a href="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). (*) 424 425Para entender mais sobre performance, veja a seção <a href="https://fastapi.tiangolo.com/benchmarks/" class="internal-link" target="_blank">Benchmarks</a>. 426 427## Dependências opcionais 428 429Usados por Pydantic: 430 431* <a href="https://github.com/esnme/ultrajson" target="_blank"><code>ujson</code></a> - para JSON mais rápido <abbr title="converte uma string que chega de uma requisição HTTP para dados Python">"parsing"</abbr>. 432* <a href="https://github.com/JoshData/python-email-validator" target="_blank"><code>email_validator</code></a> - para validação de email. 433 434Usados por Starlette: 435 436* <a href="https://requests.readthedocs.io" target="_blank"><code>requests</code></a> - Necessário se você quiser utilizar o `TestClient`. 437* <a href="https://github.com/Tinche/aiofiles" target="_blank"><code>aiofiles</code></a> - Necessário se você quiser utilizar o `FileResponse` ou `StaticFiles`. 438* <a href="https://jinja.palletsprojects.com" target="_blank"><code>jinja2</code></a> - Necessário se você quiser utilizar a configuração padrão de templates. 439* <a href="https://andrew-d.github.io/python-multipart/" target="_blank"><code>python-multipart</code></a> - Necessário se você quiser suporte com <abbr title="converte uma string que chega de uma requisição HTTP para dados Python">"parsing"</abbr> de formulário, com `request.form()`. 440* <a href="https://pythonhosted.org/itsdangerous/" target="_blank"><code>itsdangerous</code></a> - Necessário para suporte a `SessionMiddleware`. 441* <a href="https://pyyaml.org/wiki/PyYAMLDocumentation" target="_blank"><code>pyyaml</code></a> - Necessário para suporte a `SchemaGenerator` da Starlette (você provavelmente não precisará disso com o FastAPI). 442* <a href="https://graphene-python.org/" target="_blank"><code>graphene</code></a> - Necessário para suporte a `GraphQLApp`. 443* <a href="https://github.com/esnme/ultrajson" target="_blank"><code>ujson</code></a> - Necessário se você quer utilizar `UJSONResponse`. 444 445Usados por FastAPI / Starlette: 446 447* <a href="https://www.uvicorn.org" target="_blank"><code>uvicorn</code></a> - para o servidor que carrega e serve sua aplicação. 448* <a href="https://github.com/ijl/orjson" target="_blank"><code>orjson</code></a> - Necessário se você quer utilizar `ORJSONResponse`. 449 450Você pode instalar todas essas dependências com `pip install fastapi[all]`. 451 452## Licença 453 454Esse projeto é licenciado sob os termos da licença MIT. 455