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