Apidog

منصة تطوير API تعاونية متكاملة

تصميم API

توثيق API

تصحيح أخطاء API

محاكاة API

اختبار API الآلي

Invocando Endpoints de Registro da Versão 2 com Python FastAPI

1. Introdução ao FastAPI e Invocação de Endpoint O que é FastAPI? FastAPI é um framework web moderno e de alto desempenho para construir APIs com Python 3.7+ baseado em dicas de tipo padrão do Python. Ele oferece várias vantagens: * Alto Desempenho: O FastAPI é projetado para velocidade, utilizando programação assíncrona para lidar com milhares de requisições por segundo. * Documentação Automática: Ele gera automaticamente documentação interativa da API utilizando Swagger UI e ReDoc. * Veri

@apidog

@apidog

Updated on نوفمبر 6, 2024

1. Introdução ao FastAPI e Invocação de Endpoint

O que é FastAPI?
FastAPI é um framework web moderno e de alto desempenho para construir APIs com Python 3.7+ baseado em dicas de tipo padrão do Python. Ele oferece várias vantagens:

  • Alto Desempenho: O FastAPI é projetado para velocidade, utilizando programação assíncrona para lidar com milhares de requisições por segundo.
  • Documentação Automática: Ele gera automaticamente documentação interativa da API utilizando Swagger UI e ReDoc.
  • Verificação de Tipos: O FastAPI utiliza as dicas de tipo do Python para fornecer validação e serialização de dados automáticas.

Como fazer uma aplicação FastAPI:

from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
    return {"Hello": "World"}

FastAPI na Pilha Web

Imagine navegar pela paisagem web movimentada com o FastAPI como seu guia de confiança. Nosso diagrama de visão geral (figura 1) apresenta uma visão clara e envolvente de como o FastAPI se integra perfeitamente à pilha web.

Na parte superior, você tem requisições de clientes — essas são as interações do dia a dia dos usuários que buscam acessar sua aplicação. O FastAPI atua como a ponte dinâmica entre essas requisições e seu servidor. Ele é projetado para lidar com dados recebidos de forma rápida e eficiente, garantindo que cada interação seja suave e responsiva.

Abaixo da aplicação FastAPI, você encontrará um processo simplificado onde a mágica acontece. O FastAPI é conhecido por sua velocidade e desempenho, processando requisições com velocidade e precisão impressionantes. É como ter um assistente de primeira linha que não só entende suas necessidades, mas também as antecipa, fornecendo respostas em tempo recorde.

Finalmente, a figura 1 mostra como as respostas retornam aos clientes. O FastAPI garante que essas respostas não sejam apenas rápidas, mas também altamente confiáveis, melhorando a experiência geral do usuário.

Portanto, se você está procurando uma solução poderosa, eficiente e amigável para elevar suas aplicações web, o FastAPI é sua escolha ideal. Mergulhe no diagrama e veja como o FastAPI pode transformar sua pilha web com suas capacidades excepcionais.

Figura 1

Visão Geral da Invocação de Endpoint

A invocação de endpoint refere-se ao processo de enviar uma requisição a um endpoint específico da API para executar uma ação definida. No FastAPI, isso envolve definir rotas e lidar com requisições recebidas.

Criando Endpoints:

No FastAPI, você define endpoints usando decoradores. Cada decorador corresponde a um método HTTP e um caminho de URL.

É assim que funciona: from fastapi import FastAPI

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

Essa configuração permite que os usuários solicitem itens específicos pelo seu ID, e sua aplicação rapidamente entrega as informações que eles buscam em um formato JSON organizado;

  • @app.get(“/items/{item_id}”) define um endpoint GET onde item_id é um parâmetro de caminho.
  • A função read_item lida com a requisição e retorna uma resposta JSON.

Imagine isso: uma requisição percorrendo sua aplicação, e nosso diagrama de endpoint (figura 2) é como um mapa mostrando sua aventura.

Primeiro, uma requisição segue em direção a um endpoint, onde é recebida e começa sua jornada. Imagine isso como um portão acolhedor onde a requisição é preparada e está pronta. Em seguida, mergulhamos nos parâmetros. Eles são como instruções ou detalhes especiais que guiam a requisição em seu caminho, garantindo que chegue exatamente onde precisa ir.

Uma vez que a requisição tenha todos os seus detalhes organizados, ela chega à fase de processamento da requisição. Pense nisso como o coração da ação, onde a requisição é processada, e todas as operações necessárias são realizadas para obter os resultados corretos.

Finalmente, a requisição chega ao final de sua jornada com uma resposta. Isso é como o destino final onde os resultados da requisição são preparados e enviados de volta para onde tudo começou.

Assim, a figura 2 não é apenas um fluxograma — é uma história visual de como cada requisição viaja pelo seu sistema, recebendo o tratamento certo e retornando com a resposta perfeita.

Figura 2

Importância da Registro em APIs
O registro é crucial para monitorar, depurar e manter APIs. Ele ajuda os desenvolvedores:

  • Rastrear Requisições e Respostas: Entender como a API está sendo usada e solucionar problemas.
  • Monitorar Desempenho: Identificar gargalos de desempenho e otimizar a API.
  • Auditoria e Segurança: Manter registros do uso da API para auditorias de conformidade e segurança.

É assim que funciona:
Você pode usar o módulo de registro embutido do Python para adicionar registro à sua aplicação FastAPI:

import logging
from fastapi import FastAPI
app = FastAPI()
# Configurar o registro
logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    logger.info(f"Requisição recebida para item_id: {item_id} com consulta: {q}")
    return {"item_id": item_id, "q": q}

Vamos mergulhar em como o registro funciona com essa configuração.

Primeiro, logging.basicConfig é como definir as regras para como você deseja lidar com seus logs. É onde você decide coisas como onde seus logs vão e como devem ser formatados. Pense nisso como montar sua caixa de ferramentas de registro para que tudo esteja pronto para capturar informações importantes.

Em seguida, temos logger.info. Aqui é onde a mágica acontece. Quando você chama logger.info, está adicionando uma mensagem informativa aos seus logs. Neste caso, tudo é sobre registrar detalhes de uma requisição. É como anotar o que está acontecendo, para que você tenha um registro disso para referência futura.

Agora, sobre o Diagrama de Fluxo de Registro (figura 3). Este diagrama é como um guia visual mostrando como uma requisição é registrada do início ao fim. Ele mapeia a jornada, desde a configuração do registro até a captura e gravação da mensagem. É uma maneira prática de ver como todas as peças se juntam para acompanhar as atividades da sua aplicação.

Figura 3

2. Configurando FastAPI para Endpoints da Versão 2

Bem-vindo ao mundo do FastAPI! Se você está ansioso para aproveitar o poder de um dos frameworks mais rápidos para construir APIs com Python, você está no lugar certo. Se você está atualizando suas APIs existentes para a versão 2 ou começando do zero, este guia o levará por tudo o que você precisa para começar. Desde a instalação do FastAPI e Uvicorn até a configuração da estrutura do seu projeto e a elaboração de uma aplicação básica, nós temos tudo o que você precisa. Vamos mergulhar!

1. Instalando FastAPI e Uvicorn

Por que FastAPI? FastAPI é conhecido por sua velocidade, simplicidade e recursos modernos. Ele é perfeito para construir APIs que são rápidas e fáceis de manter.

Por que Uvicorn? O Uvicorn é um servidor ASGI de alto desempenho que é ideal para executar aplicações FastAPI. Ele suporta operações assíncronas, tornando-o uma ótima escolha para aplicações escaláveis.

Começando:

Para instalar o FastAPI e o Uvicorn, basta executar: pip install fastapi uvicorn

Características para destacar:

  • FastAPI: Permite documentação interativa automática, validação e suporte assíncrono.
  • Uvicorn: Age como um servidor ASGI de alta velocidade, perfeito para ambientes de desenvolvimento e produção.

Imagine que você está configurando seu ambiente de desenvolvimento e deseja ver como tudo se encaixa. O Diagrama de Fluxo de Instalação (figura 4) é como um mapa que mostra exatamente como o FastAPI e o Uvicorn se juntam para fazer sua aplicação web funcionar perfeitamente.

Pense no FastAPI como o poderoso framework de API que lida com toda a mágica por trás das requisições e respostas da sua aplicação. É como o cérebro da sua aplicação, processando dados e gerenciando interações.

Agora, o Uvicorn é o servidor que traz o FastAPI à vida. É o motor confiável que opera nos bastidores, garantindo que o FastAPI lide com as requisições recebidas e forneça as respostas de maneira eficiente.

Este diagrama ajuda você a visualizar como o FastAPI e o Uvicorn interagem dentro da sua configuração de desenvolvimento. Ele mostra a relação entre eles e como eles se encaixam na visão mais ampla do seu servidor e framework de aplicação. É uma forma prática de entender o fluxo e ver como cada parte contribui para o todo.

Figura 4
Figura 4

2. Estrutura do Projeto e Dependências

Por que organizar seu projeto? Um projeto bem estruturado não só ajuda na manutenção e escalabilidade da sua aplicação, mas também garante que a colaboração com outros seja suave e eficiente.

Como configurar:

1. Crie o Diretório do Projeto: Organize seus arquivos de projeto em diretórios.

2. Defina Dependências: Use requirements.txt para listar todos os pacotes, facilitando a instalação deles com: pip install -r requirements.txt

Pense no Diagrama de Estrutura do Projeto (figura 5) como um plano para sua base de código. É como um mapa detalhado que mostra como tudo está organizado no seu projeto.

Imagine que você está configurando um novo projeto e precisa descobrir onde colocar diferentes peças, como endpoints, modelos e esquemas. Este diagrama torna fácil ver onde cada parte deve ir.

É como ter um arquivo bem organizado onde você sabe exatamente qual gaveta abrir para seus endpoints de API, onde arquivar seus modelos de dados e onde manter seus esquemas. Ao visualizar a estrutura, você pode entender rapidamente como todos os componentes se encaixam e manter seu projeto limpo e gerenciável.

Figura 5

• app/main.py: O coração da sua aplicação FastAPI.
• app/api/v2/endpoints.py: Onde você definirá seus endpoints da versão 2.
• requirements.txt: Um arquivo que lista todas as dependências do seu projeto.

3. Criando uma Aplicação Básica FastAPI

Por que começar simples? Uma aplicação simples e funcional prepara o cenário para adicionar recursos mais complexos. Isso garante que você entenda os componentes principais do FastAPI antes de mergulhar mais fundo.

Como a Aplicação Básica funciona:

# app/main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Bem-vindo ao FastAPI!"}

@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "query": q}

Executando sua Aplicação:

Para ver seu aplicativo FastAPI em ação, execute:

uvicorn app.main:app --reload

Acesse http://127.0.0.1:8000 no seu navegador, e você verá sua API em ação. Não se esqueça de conferir a documentação interativa da API em:

http://127.0.0.1:8000/docs.

Características para destacar:


• Documentação Interativa: Automaticamente gerada e acessível através de /docs e /redoc.
• Suporte Assíncrono: O FastAPI permite alta concorrência com operações assíncronas.

Imagine que você está rastreando uma requisição enquanto ela viaja pela sua aplicação FastAPI. O Diagrama de Fluxo da Aplicação Básica ilustrado na figura 6 é como um guia passo a passo que mostra essa jornada em ação.

Veja como funciona: uma requisição chega, e o diagrama mostra exatamente como ela é processada. Primeiro, sua aplicação FastAPI recebe a requisição — pense nisso como o ponto de partida onde sua aplicação acolhe os dados recebidos.

Em seguida, o diagrama delineia a jornada dessa requisição enquanto ela é manipulada. Isso inclui qualquer processamento, interações com bancos de dados ou qualquer outra operação que sua aplicação realiza.

Finalmente, ele mostra como a aplicação fecha tudo e envia uma resposta de volta. É como rastrear um pacote desde o momento em que chega ao armazém até quando é entregue ao cliente.

Figura 6

Configurar o FastAPI para endpoints da versão 2 é fácil e definitivamente vale a pena. Com os poderosos recursos do FastAPI e a velocidade do Uvicorn, você estará construindo APIs eficientes e escaláveis em pouco tempo.

3. Aprimorando o Registro com Endpoints da Versão 2

Quando se trata de construir aplicações web robustas e escaláveis, o registro não é apenas um recurso; é um componente crítico que ajuda no monitoramento, depuração e manutenção da saúde da aplicação. Com o FastAPI, você pode aproveitar as capacidades avançadas de registro para garantir que sua aplicação funcione sem problemas e que os problemas sejam resolvidos rapidamente. Neste guia, vamos orientá-lo sobre como aprimorar sua configuração de registro com FastAPI, focando nos Endpoints da Versão 2. Vamos lá!

Introdução aos Recursos de Registro do FastAPI

O FastAPI oferece suporte embutido para registro, que é essencial para rastrear o comportamento da aplicação e diagnosticar problemas. O registro fornece uma maneira de registrar eventos, erros e outras ocorrências significativas em sua aplicação. Essa funcionalidade é crucial para entender o desempenho da aplicação e as interações dos usuários.

Por que o Registro é Importante:

• Depuração: Identifique e resolva rapidamente problemas no seu código.

• Monitoramento: Acompanhe a saúde e o desempenho da aplicação.

• Auditoria: Registre ações dos usuários e mudanças no sistema para segurança e conformidade.

O FastAPI se integra perfeitamente à biblioteca padrão de registro do Python, permitindo configurações de registro flexíveis e poderosas.

Figura 7

Veja um rápido olhar sobre como o registro se encaixa com o FastAPI:

  1. Caixa FastAPI: A "Aplicação FastAPI" central é destacada em azul, mostrando-a como o coração de sua configuração.
  2. Níveis de Registro: INFO (verde), DEBUG (laranja) e ERROR (vermelho) são os diferentes níveis de registro, cada um conectado ao FastAPI com setas.
  3. Sistema de Registro do Python: Isso está em dourado à direita, indicando que lida com todas as mensagens de log do FastAPI.

A figura 7 ajuda você a ver como o FastAPI funciona com a biblioteca de registro do Python, ilustrando como diferentes níveis de log interagem com sua aplicação.

Configurando a Configuração de Registro

Configurar o registro no FastAPI envolve definir uma configuração de registro que atenda às suas necessidades. Você pode definir níveis de registro, formatar mensagens e especificar onde os logs devem ser enviados (console, arquivo, etc.).

Etapas para Configurar o Registro:

  1. Importe o Módulo de Registro: Use o módulo logging do Python para configurar sua configuração.
  2. Defina a Configuração de Registro: Defina o nível de registro, formato e manipuladores.
  3. Inicialize o Registro no FastAPI: Aplique a configuração à sua aplicação FastAPI.

Aqui está uma configuração básica para registro no FastAPI:

import logging
from fastapi import FastAPI

# Configurar o registro
logging.basicConfig(level=logging.INFO,  # Ajuste o nível conforme necessário
                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
                    handlers=[logging.StreamHandler()])  # Logs para console

app = FastAPI()

@app.get("/")
def read_root():
    logging.info("Endpoint raiz acessado")
    return {"Hello": "World"}

@app.get("/items/{item_id}")
def read_item(item_id: int):
    logging.debug(f"Item solicitado: {item_id}")
    if item_id > 10:
        logging.error("ID do item é muito alto")
    return {"item_id": item_id}

Características para Destacar:
• Níveis de Registro: INFO, DEBUG, ERROR — use diferentes níveis para controlar a verbosidade dos logs.
• Manipuladores Personalizados: Direcione logs para arquivos, servidores remotos ou outros destinos.
• Formatação de Mensagens: Personalize formatos de mensagem de log para incluir timestamps, níveis de log, etc.

Figura 8

Aqui está um rápido resumo de como o registro é configurado:

  1. Configuração de Registro: No topo, uma caixa dourada mostra onde a configuração de registro ocorre.
  2. Componentes da Aplicação: Três caixas azuis representam diferentes partes da sua aplicação onde logs são gerados.
  3. Logger: A caixa verde coleta esses logs e os direciona para onde precisam ir.
  4. Manipuladores: Duas caixas vermelho-alaranjadas mostram os Manipuladores de Arquivo e Console que processam e formatam os logs.
  5. Destinos: Caixas roxas à direita indicam onde os logs acabam, como arquivos de log ou o console.

Este fluxograma ilustrado na figura 8 facilita a visão de como as mensagens de log viajam de sua aplicação para seus destinos finais.

Implementando Endpoints da Versão 2 para Registro

Com o FastAPI, os Endpoints da Versão 2 oferecem capacidades aprimoradas para registro. Você pode construir sobre o registro padrão do FastAPI para implementar estratégias de registro mais sofisticadas para seus endpoints.

Considerações-chave:

• Registro Estruturado: Use logs estruturados para capturar informações detalhadas e acionáveis.

• Tratamento de Erros Aprimorado: Registre informações detalhadas de erro para diagnosticar problemas de forma eficaz.

• Métricas de Desempenho: Acompanhe métricas de desempenho, como duração da requisição e throughput.

Aqui está como você pode implementar o registro nos Endpoints da Versão 2:

from fastapi import FastAPI, Request
import logging

app = FastAPI()

# Configuração avançada de registro
logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
                    handlers=[logging.FileHandler("app.log"), logging.StreamHandler()])

@app.post("/log")
async def log_endpoint(request: Request):
    body = await request.json()
    logging.info(f"Requisição recebida com corpo: {body}")
    return {"status": "registrado"}

@app.get("/performance")
def performance_metrics():
    # Exemplo de registro de métricas de desempenho
    start_time = logging.datetime.now()
    # Simular processamento
    logging.info(f"Métricas de desempenho solicitadas em {start_time}")
    return {"metrics": "métricas_exemplo"}

Características para Destacar:
• Registro Assíncrono: Lida com logs de maneira assíncrona para melhor desempenho.
• Registro em Arquivo: Salve logs em um arquivo para armazenamento persistente.
• Registro de Desempenho: Capture e analise métricas de desempenho.

Figura 9

Aqui está um simples resumo de como o registro funciona com suas requisições:
1. Caixa de Requisição: Esta caixa azul clara é onde as requisições recebidas começam.
2. Tipos de Log:
• Os logs de INFO estão em verde.
• Os logs de ERROR estão em vermelho.
• Os logs de DEBUG estão em dourado.
3. Manipuladores: Logs se movem para:
• Manipulador de Arquivo (azul).
• Manipulador de Console (também azul).
4. Destinos: Logs acabam em:
Arquivo de Log ou Console (roxo).
A figura 9 mostra como requisições levam a diferentes tipos de log, que são então manipulados e direcionados a seus destinos finais. Configurar isso corretamente garante que você tenha insights claros e possa manter seu aplicativo FastAPI funcionando sem problemas.

4. Recursos Avançados de Registro e Melhores Práticas

Em qualquer aplicação FastAPI, o registro vai além de apenas gravar mensagens em um console. Trata-se de construir um sistema robusto que ajuda você a rastrear problemas, monitorar o desempenho e gerenciar erros de forma eficaz. Ao aproveitar os recursos avançados de registro e as melhores práticas, você pode transformar seus logs em uma ferramenta valiosa para manter e escalar sua aplicação.

Vamos explorar alguns dos recursos mais avançados de registro no FastAPI, focando na injeção de dependência para registro, personalização de mensagens de log e melhores práticas para tratamento de exceções e erros.

Usando Injeção de Dependência para Registro

A injeção de dependência no FastAPI é um recurso incrivelmente poderoso, e se estende também ao registro. Em vez de configurar o registro separadamente em cada função, você pode injetá-lo em suas rotas, tornando seu código mais limpo e escalável.

Por que usar a injeção de dependência para registro?
• Consistência: Garante uma configuração de registro consistente entre todos os endpoints.
• Reutilização: Permite que você defina e use configurações de registro centralmente, evitando código redundante.
• Flexibilidade: Facilita a modificação de sua configuração de registro sem alterar o código de endpoints individuais.
Aqui está como você pode injetar uma instância de registro usando a função Depends do FastAPI:

import logging
from fastapi import FastAPI, Depends

app = FastAPI()

# Configuração de registro
def get_logger():
    logger = logging.getLogger("app_logger")
    logger.setLevel(logging.INFO)
    if not logger.handlers:
        handler = logging.StreamHandler()
        handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
        logger.addHandler(handler)
    return logger

@app.get("/items/")
def read_items(logger=Depends(get_logger)):
    logger.info("Endpoint de itens acessado")
    return {"message": "Buscando itens"}

Características para Destacar:
• Configuração Centralizada do Logger: Com injeção de dependência, você define seu logger apenas uma vez.
• Injeção Automática: O FastAPI fornece automaticamente o logger para qualquer endpoint que precise dele.

Figura 10

A figura 10 ilustra o Fluxo de Injeção de Dependência que mostra como requisições se transformam em logs, como são manipuladas e onde elas terminam. Tudo isso é para manter sua aplicação FastAPI funcionando suavemente com registro claro.

Aspectos-chave do fluxograma de injeção de dependência:
• Requisição do Cliente: O ponto de partida onde o cliente envia uma requisição para a aplicação FastAPI.
• Endpoint do FastAPI: Representa o endpoint no FastAPI onde a injeção de dependência ocorre.
• Logger Injetado via DI: Mostra que o logger é injetado no endpoint usando o mecanismo de injeção de dependência do FastAPI.
• Registro (Informações da Requisição): Registra os detalhes da requisição, como método, caminho e outras informações úteis.
• Resposta do FastAPI: A resposta retornada ao cliente após o registro da requisição.

Personalizando Mensagens de Log
A capacidade de personalizar mensagens de log é crucial para tornar seus logs informativos e acionáveis. Logs padrão podem nem sempre fornecer contexto suficiente, especialmente em ambientes de produção. A integração do FastAPI com o módulo de registro do Python torna fácil adicionar detalhes personalizados aos seus logs.
Estratégias-chave para Personalizar Mensagens de Log:
• Adicione Informações da Requisição: Inclua detalhes da requisição, como endereço IP, cabeçalhos e caminho.
• Adicione Informações Contextuais: Personalize logs para incluir informações relevantes para o endpoint ou operação atual, como ações do usuário ou detalhes específicos do recurso.
• Formate para Legibilidade: Use logs estruturados ou formato JSON para melhor legibilidade e integração mais fácil com ferramentas de registro como stack ELK.
Aqui está como personalizar mensagens de log com detalhes da requisição:

from fastapi import Request

@app.middleware("http")
async def log_requests(request: Request, call_next):
    logger = logging.getLogger("custom_logger")
    logger.info(f"Requisição recebida: {request.method} {request.url}")
    response = await call_next(request)
    logger.info(f"Status da resposta: {response.status_code}")
    return response

Características para Destacar:
• Middleware para Registro: Este middleware registra tanto requisições recebidas quanto respostas enviadas.
• Informações Personalizadas: Você pode registrar detalhes específicos, como método de requisição, URL e status da resposta.

Figura 11

Imagine este Fluxo de Log Personalizado ilustrado na figura 11 como um guia para rastrear uma requisição pelo seu sistema. Começa com a requisição passando pelo middleware, onde é registrada com detalhes personalizados. Em seguida, à medida que o processo continua, a resposta também é registrada. O gráfico destaca os pontos-chave onde essas mensagens de log personalizadas são adicionadas, dando uma visão clara de como tudo é rastreado e registrado.

Tratamento de Exceções e Erros

Quando ocorrem erros em sua aplicação, o registro desempenha um papel crucial na rastreação da causa raiz. Os recursos de tratamento de exceções do FastAPI, combinados com o registro, garantem que você capture e registre informações detalhadas sobre erros sem expor detalhes sensíveis aos usuários.

Melhores Práticas para Registrar Exceções:
• Registre Informações Detalhadas de Erro: Capture rastros de pilha, mensagens de erro e contexto da requisição.
• Registre Diferentes Níveis de Erro: Use níveis de registro apropriados como ERROR ou CRITICAL para exceções, a fim de diferenciá-las de entradas de log regulares.
• Evite Registro Excessivo: Esteja atento ao registrar informações sensíveis ou muitos detalhes que poderiam desordenar seus logs.
Aqui está como lidar e registrar exceções no FastAPI:

from fastapi import HTTPException
import logging

@app.get("/items/{item_id}")
def read_item(item_id: int, logger=Depends(get_logger)):
    try:
        if item_id > 100:
            raise HTTPException(status_code=404, detail="Item não encontrado")
        logger.info(f"Item {item_id} buscado com sucesso")
        return {"item_id": item_id}
    except HTTPException as e:
        logger.error(f"Erro ao buscar item {item_id}: {e.detail}")
        raise e

Características para Destacar:
• Registro Estruturado de Exceções: Registre informações detalhadas quando uma exceção ocorre, incluindo o ID do item e detalhes do erro.
• Tratamento de Erros Suave: Lance exceções HTTP enquanto registra o problema para análise posterior.

Figura 12

O Diagrama de Fluxo de Registro de Exceções mostra como as exceções são tratadas em sua aplicação FastAPI. A Representação do Fluxo é a seguinte:
Fluxo normal: O cliente envia uma requisição O middleware a processa O endpoint gera uma resposta O cliente recebe a resposta.
• Fluxo de exceção: Se uma exceção ocorre no endpoint, ela é registrada e uma resposta de erro personalizada é enviada de volta ao cliente.


Ao utilizar práticas avançadas de registro, você aumentará a confiabilidade de sua aplicação e a facilidade de manutenção. Um bom registro ajuda a capturar problemas precocemente e a manter tudo funcionando sem problemas. Adote essas práticas e você terá menos dores de cabeça e uma aplicação FastAPI mais robusta!

5. Testando e Depurando Sua API

No âmbito do desenvolvimento de APIs, testar e depurar são seus melhores aliados para garantir uma aplicação robusta e confiável. Vamos mergulhar em como você pode testar e depurar seus endpoints FastAPI para garantir que eles funcionem como esperado e estejam prontos para lidar com cenários do mundo real.

Escrevendo Testes para Seus Endpoints

Por que Testar? Testar é a rede de segurança que captura bugs antes que eles atinjam seus usuários. Para sua aplicação FastAPI, escrever testes para seus endpoints garante que cada requisição e resposta atenda às suas expectativas, minimizando o risco de comportamentos inesperados.

  1. Comece com Testes Unitários: Use o cliente de teste do FastAPI para escrever testes unitários para endpoints individuais. Isso ajuda a validar a funcionalidade central da sua API.
from fastapi.testclient import TestClient
from myapp import app

client = TestClient(app)

def test_read_main():
    response = client.get("/")
    assert response.status_code == 200
    assert response.json() == {"message": "Hello World"}
Figura 13

Imagine que você acabou de construir um novo app, e agora deseja garantir que testou todas as suas partes de forma abrangente. É aí que nosso Diagrama de Cobertura de Testes entra em cena. Pense nisso como um mapa visual da sua aplicação, mostrando quais áreas estão bem cobertas pelos testes e quais podem precisar de mais atenção.

No diagrama, você verá vários retângulos coloridos representando diferentes componentes da sua aplicação, como Endpoints, Modelos, Banco de Dados, Serviços, Utilidades e Middleware. Cada cor destaca uma parte diferente do seu sistema, facilitando a distinção entre elas à primeira vista.

Aqui está a parte interessante: alguns desses componentes têm uma marca de seleção nítida sobre eles, significando que foram testados minuciosamente. Mas, e aqui está o ponto crucial, alguns componentes estão marcados com uma seta pontilhada vermelha e a etiqueta “Não Coberto.” Esse indicador vermelho é como uma luz piscante que diz: “Ei, esta parte do seu app pode estar em risco porque ainda não foi testada.”

Assim, este diagrama não é apenas uma imagem bonita — é uma ferramenta prática que ajuda a identificar lacunas na sua cobertura de testes e garante que você não esteja perdendo nenhuma parte crítica da sua aplicação. É tudo sobre lhe dar uma visão clara de onde seus esforços de teste estão valendo a pena e onde você pode precisar se esforçar mais.

2. Expanda para Testes de Integração: Teste como diferentes componentes da sua aplicação funcionam juntos. Por exemplo, assegure-se de que interações com o banco de dados e chamadas de API externas estão funcionando como pretendido.

def test_create_item():
    response = client.post("/items/", json={"name": "item1", "price": 10.0})
    assert response.status_code == 201
    assert response.json() == {"name": "item1", "price": 10.0, "id": 1}
Figura 14

3. Aproveite Conjuntos de Testes: Organize seus testes em conjuntos para otimizar o processo de teste e garantir uma cobertura abrangente. Use ferramentas como pytest para automatizar e gerenciar suas execuções de teste.

# Execute todos os testes usando pytest
pytest --maxfail=1 --disable-warnings -q

Depurando Problemas Comuns

A depuração é semelhante a um trabalho de detetive na programação. Trata-se de rastrear as causas raízes dos problemas e resolvê-los de forma eficiente.

  1. Use o Registro de Forma Eficiente: Incorpore um registro robusto em sua aplicação para rastrear o fluxo de requisições e identificar onde as coisas podem estar