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:

  1. Criar dependência obter_parametros_paginacao retornando 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)

  1. Salve o arquivo como: Atividade_04_1_SeuNome
  2. 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:

  1. Implementar classe FiltroAuditoria que possa ser instanciada diretamente via Depends(FiltroAuditoria).

Resultado Esperado

Filtro instanciado com data_inicio e usuario_id.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_04_2_SeuNome
  2. 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:

  1. Criar dependência obter_usuario_autenticado que dependa internamente de obter_token_jwt e obter_sessao_db.

Resultado Esperado

Dependências encadeadas resolvidas: Token -> Sessão -> Usuário.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_04_3_SeuNome
  2. 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:

  1. Implementar dependência de sessão de banco com yield garantindo 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)

  1. Salve o arquivo como: Atividade_04_4_SeuNome
  2. 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"}