Oficina FastAPI
Oficina FastAPI
Oficina FastAPI
https://bit.ly/oficinafastapi
Requisitos:
• Starlette – framework web leve.
• Pydantic – biblioteca para validação de dados.
FastAPI
• mkdir oficina_fastapi
• cd oficina_fastapi
• uv venv --python 3.12
• source .venv/bin/activate
• uv init
• uv add fastapi[standard]
main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def home():
return {"msg": "Olá, mundo!"}
FastAPI
• Execute assim para acesso local:
▫ fastapi dev main.py
• Abrindo a aplicação para o “mundo”:
▫ fastapi dev main.py --host 0.0.0.0
• No navegador acesse:
▫ http://127.0.0.1:8000/
▫ http://127.0.0.1:8000/items/1?q=monitor
▫ Documentação:
http://localhost:8000/docs
http://localhost:8000/redoc
Uvicorn
• https://www.uvicorn.org
• Servidor de aplicação ASGI (Asynchronous Server Gateway
Interface).
▫ Ao contrário do WSGI (usado por frameworks como Flask e
Django), o ASGI permite suporte a conexões assíncronas e
WebSockets, muito úteis para aplicações modernas, que
demandam comunicação em tempo real.
• Projetado para rodar aplicações Python assíncronas, especialmente
aquelas desenvolvidas com frameworks modernos como FastAPI e
Starlette.
• Leve e rápido
▫ Ideal para situações em que a performance e a capacidade de
lidar com conexões simultâneas são cruciais.
• A aplicação pode rodar assim também:
▫ uvicorn main:app –reload
▫ Utilizar o --reload durante o desenvolvimento para recarregar
automaticamente alterações no código.
HTTP - Códigos de resposta
@app.get("/")
def read_root():
return {"msg": "Hello World"}
=
@app.get("/", status_code=HTTPStatus.OK)
def read_root():
return {"msg": "Hello World"}
HTTP - Códigos de resposta
Código Categoria Descrição
HTTP
1xx Informativo Utilizado para enviar informações para o cliente de que
sua requisição foi recebida e está sendo processada.
2xx Sucesso Indica que a requisição foi bem-sucedida (por exemplo,
200 OK, 201 Created).
3xx Redirecionamento Informa que mais ações são necessárias para completar a
requisição (por exemplo, 301 Moved Permanently, 302
Found).
4xx Erro no Cliente Significa que houve um erro na requisição feita pelo
cliente (por exemplo, 400 Bad Request, 404 Not Found).
5xx Erro no Servidor Indica um erro no servidor ao processar a requisição
válida do cliente (por exemplo, 500 Internal Server Error,
503 Service Unavailable).
Códigos de resposta mais usados
Código HTTP Descrição
200 OK A solicitação foi bem-sucedida. O significado exato depende
do método HTTP utilizado na solicitação.
201 Created A solicitação foi bem-sucedida e um novo recurso foi criado
como resultado.
404 Not Found O recurso solicitado não pôde ser encontrado, sendo
frequentemente usado quando o recurso é inexistente.
422 Usado quando a requisição está bem-formada, mas não pode
Unprocessable ser seguida devido a erros semânticos. É comum em APIs ao
Entity validar dados de entrada.
500 Internal Quando ocorre um erro na nossa aplicação.
Server Error
main2.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def home():
return {"msg": "Olá, mundo!"}
@app.get("/posts/{id}")
def read_item(id: int, titulo: str | None = None):
return {"id": id, "titulo": titulo}
Pydantic
• Biblioteca Python usada para validação de dados
e criação de modelos de dados fortemente
tipados.
• Amplamente utilizada para garantir que os
dados estejam no formato correto, validando
tipos e valores automaticamente.
• Popular em projetos como FastAPI, onde facilita
a validação e serialização de dados de entrada e
saída.
ORM
• ORM (Object Relational Mapping) é uma
camada que permite conectar a programação
orientada a objetos com bancos de dados
relacionais, abstraindo os comandos SQL
subjacentes.
SQLAlchemy
• É uma das bibliotecas ORM mais populares no ecossistema
Python.
• Permite a execução de ações em um banco de dados relacionais.
• Simplifica interações com bancos de dados relacionais.
• Suporte nativo a:
▫ Microsoft SQL Server
▫ MySQL / MariaDB
▫ Oracle
▫ PostgreSQL
▫ SQLite
• Embora seja projetado para bancos relacionais, ele pode ser
estendido para trabalhar com bancos NoSQL por meio de
adaptações e extensões como MongoAlchemy.
SQLModel
• Biblioteca que combina e simplifica recursos do Pydantic e
do SQLAlchemy para criar modelos de dados que podem ser
usados tanto para validação quanto para interagir com
bancos de dados.
• Projetada para ser intuitiva, especialmente em aplicações
implementadas com FastAPI.
• Instalação no projeto:
▫ uv add sqlmodel
.env
• Arquivo .env
DATABASE_URL="sqlite:///exemplo-orm.db"
database.py
from sqlmodel import create_engine, Session, SQLModel
from dotenv import load_dotenv
import os
# Configurações de inicialização
@asynccontextmanager
async def lifespan(app: FastAPI):
create_db_and_tables()
yield
app = FastAPI(lifespan=lifespan)
main3.py (2/2)
@app.get("/")
def home():
return {"msg": "Olá, mundo!"}
@app.post("/posts", response_model=Post)
def criar_post(post: Post, session: Session = Depends(get_session)) -> Post:
session.add(post)
session.commit()
session.refresh(post)
return post
@app.get("/posts", response_model=list[Post])
def listar_posts(session: Session = Depends(get_session)) -> list[Post]:
posts = session.exec(select(Post)).all()
return posts
Referências
• Repositório Git da Oficina
▫ https://bit.ly/oficinafastapi
• Curso completo de FastAPI por Eduardo Mendes
▫ https://fastapidozero.dunossauro.com/
▫ https://github.com/dunossauro/fastapi-do-zero
▫ Playlist no YouTube
• FastAPI - https://fastapi.tiangolo.com/
• Pydantic - https://pydantic.dev/
• SQLAlchemy - https://www.sqlalchemy.org/
• SQLModel - https://sqlmodel.tiangolo.com/
Obrigado!
Dúvidas, comentários, sugestões?