🧩 Exercícios: Injeção de Dependências com Depends e Annotated
Spec Backend Com Python E Fastapi • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 04.1 — Dependência Funcional Simples de Paginação
Contexto: Dependência Funcional Simples de Paginação no contexto de Injeção de Dependências com Depends e Annotated.
Requisitos de Execução:
- Criar dependência
obter_parametros_paginacaoretornando tupla(skip, limit)com valores padrão e limites seguros.
Resultado Esperado
Parâmetros de paginação: skip=0, limit=20 extraídos com sucesso.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_04_1_SeuNome - Envie na tarefa:
Atividade Cap 04 - Injeção de Dependências com Depends e Annotated
🔑 Gabarito de Código & Solução Comentada
# pagination_dependency.py
from fastapi import FastAPI, Depends, Query
from typing import Annotated
app = FastAPI()
def obter_paginacao(
skip: Annotated[int, Query(ge=0)] = 0,
limit: Annotated[int, Query(ge=1, le=100)] = 20
):
return {"skip": skip, "limit": limit}
@app.get("/artigos")
async def listar_artigos(pag: Annotated[dict, Depends(obter_paginacao)]):
return {"pagina": pag, "itens": []}
🔍 Nível 2: Prática
Problema 04.2 — Dependência Baseada em Classe para Configurações
Contexto: Dependência Baseada em Classe para Configurações no contexto de Injeção de Dependências com Depends e Annotated.
Requisitos de Execução:
- Implementar classe
FiltroAuditoriaque possa ser instanciada diretamente viaDepends(FiltroAuditoria).
Resultado Esperado
Filtro instanciado com data_inicio e usuario_id.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_04_2_SeuNome - Envie na tarefa:
Atividade Cap 04 - Injeção de Dependências com Depends e Annotated
🔑 Gabarito de Código & Solução Comentada
# class_dependency.py
from fastapi import FastAPI, Depends
from typing import Optional
class FiltroAuditoria:
def __init__(self, autor: Optional[str] = None, status: str = "ATIVO"):
self.autor = autor
self.status = status
app = FastAPI()
@app.get("/logs")
async def buscar_logs(filtro: FiltroAuditoria = Depends()):
return {"autor_filtrado": filtro.autor, "status": filtro.status}
⚡ Nível 3: Integração
Problema 04.3 — Dependências Encadeadas (Sub-dependencies)
Contexto: Dependências Encadeadas (Sub-dependencies) no contexto de Injeção de Dependências com Depends e Annotated.
Requisitos de Execução:
- Criar dependência
obter_usuario_autenticadoque dependa internamente deobter_token_jwteobter_sessao_db.
Resultado Esperado
Dependências encadeadas resolvidas: Token -> Sessão -> Usuário.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_04_3_SeuNome - Envie na tarefa:
Atividade Cap 04 - Injeção de Dependências com Depends e Annotated
🔑 Gabarito de Código & Solução Comentada
# sub_dependencies.py
from fastapi import FastAPI, Depends, HTTPException, Header
app = FastAPI()
def obter_token(authorization: str = Header(...)):
if not authorization.startswith("Bearer "): raise HTTPException(status_code=401)
return authorization.split(" ")[1]
def obter_usuario_logado(token: str = Depends(obter_token)):
if token != "secret_token_123": raise HTTPException(status_code=403)
return {"user_id": 101, "role": "ADMIN"}
@app.get("/me")
async def get_me(current_user: dict = Depends(obter_usuario_logado)):
return {"usuario": current_user}
🏆 Nível 4: Desafio Corporativo
Problema 04.4 — Dependência com Gerenciamento de Contexto (Yield Dependency)
Contexto: Dependência com Gerenciamento de Contexto (Yield Dependency) no contexto de Injeção de Dependências com Depends e Annotated.
Requisitos de Execução:
- Implementar dependência de sessão de banco com
yieldgarantindo rollback em caso de falha e fechamento seguro.
Resultado Esperado
Sessão de banco aberta -> Endpoint executado -> Sessão fechada no bloco finally.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_04_4_SeuNome - Envie na tarefa:
Atividade Cap 04 - Injeção de Dependências com Depends e Annotated
🔑 Gabarito de Código & Solução Comentada
# yield_dependency.py
from fastapi import FastAPI, Depends
app = FastAPI()
async def get_db_session():
print("LOG: Conexão com banco aberta")
db = {"status": "conectado", "id": 42}
try:
yield db
finally:
print("LOG: Conexão com banco encerrada com sucesso")
@app.get("/transacao")
async def executar_transacao(db: dict = Depends(get_db_session)):
return {"db_id": db["id"], "resultado": "OK"}