Pular para o conteúdo
murad.guide

Aplicações Web

Capítulo 25

FastAPI: validação e docs

2 min de leitura 399 palavras 1 gravura

Neste capítulo você vai refinar validação, respostas de erro e leitura das docs. O projeto-fio é o Ateliê Boa Viagem, ateliê digital fictício em Boa Viagem, Recife.

Seu ponto de partida

Use o exemplo 25-fastapi-validacao do pacote anexo e copie inicio/ para uma pasta de prática fora do original. A raiz do exemplo é a referência completa desta etapa.

Use servidor só em 127.0.0.1 quando o README do exemplo pedir HTTP local. Abrir ou testar não publica nada.

Como praticar

Leia → copie ou digite → mude uma coisa → preveja → salve → recarregue → confira. Restaure cada experiência antes da próxima. Faça as atividades antes de abrir as respostas comentadas.

Mapa visual de FastAPI: validação e docs

Respostas explícitas

Use HTTPException para 404. Documente response_model.

Faça na sua cópia

Confira o trecho no contexto do exemplo antes de mudar.

from fastapi import HTTPException
raise HTTPException(status_code=404, detail='Tarefa não encontrada')

Mude uma coisa e preveja

Padronize a mensagem de 404.

Anote o que espera observar antes de salvar e recarregar.

Recarregue e confira

detail claro no JSON.

Se não acontecer

Importe HTTPException.

Query params tipados

Filtre ?feita=true com parâmetro bool.

Faça na sua cópia

Confira o trecho no contexto do exemplo antes de mudar.

@app.get('/tarefas')
def listar(feita: bool | None = None):
    ...

Mude uma coisa e preveja

Filtre só tarefas abertas.

Anote o que espera observar antes de salvar e recarregar.

Recarregue e confira

Query altera a lista.

Se não acontecer

Compare com t.feita.

Fechar o módulo Python API

Você viu Django (páginas) e FastAPI (API). Ambos locais. Escolha no fechamento conforme o problema.

Faça na sua cópia

Confira o trecho no contexto do exemplo antes de mudar.

Django → HTML servidor
FastAPI → JSON API

Mude uma coisa e preveja

Anote um caso de uso para cada.

Anote o que espera observar antes de salvar e recarregar.

Recarregue e confira

Notas pessoais prontas para o volume 32.

Se não acontecer

Não há resposta única.

Atividades

Atividade 1

Quando usar HTTPException?

Atividade 2

O que response_model documenta?

Atividade 3

Django e FastAPI resolvem o mesmo problema sempre?

Respostas comentadas

Resposta da atividade 1

Erros HTTP conscientes (404, 400…).

Resposta da atividade 2

Formato de saída na OpenAPI/docs.

Resposta da atividade 3

Não; páginas vs API é um eixo típico.

O arquivo completo

Referência do exemplo 25-fastapi-validacao, reproduzida aqui para que você possa conferir sem sair da página.

main.py

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, Field

app = FastAPI(title="Tarefas do Ateliê")
tarefas: list[dict] = []
seq = 0

class TarefaIn(BaseModel):
    titulo: str = Field(min_length=3)
    feita: bool = False

@app.get("/tarefas")
def listar(feita: bool | None = None):
    if feita is None:
        return tarefas
    return [t for t in tarefas if t["feita"] is feita]

@app.post("/tarefas", status_code=201)
def criar(body: TarefaIn):
    global seq
    seq += 1
    t = {"id": seq, **body.model_dump()}
    tarefas.append(t)
    return t

@app.get("/tarefas/{id}")
def detalhe(id: int):
    for t in tarefas:
        if t["id"] == id:
            return t
    raise HTTPException(status_code=404, detail="Tarefa não encontrada")