Ir para o conteúdo

Middleware

Você pode adicionar middleware à suas aplicações FastAPI.

Um "middleware" é uma função que manipula cada requisição antes de ser processada por qualquer operação de rota específica. E também cada resposta antes de retorná-la.

  • Ele pega cada requisição que chega ao seu aplicativo.
  • Ele pode então fazer algo com essa requisição ou executar qualquer código necessário.
  • Então ele passa a requisição para ser processada pelo resto do aplicativo (por alguma operação de rota).
  • Ele então pega a resposta gerada pelo aplicativo (por alguma operação de rota).
  • Ele pode fazer algo com essa resposta ou executar qualquer código necessário.
  • Então ele retorna a resposta.

"Detalhes técnicos"

Se você tiver dependências com yield, o código de saída será executado depois do middleware.

Se houver alguma tarefa em segundo plano (documentada posteriormente), ela será executada depois de todo o middleware.

Criar um middleware

Para criar um middleware, use o decorador @app.middleware("http") logo acima de uma função.

A função middleware recebe:

  • A request.
  • Uma função call_next que receberá o request como um parâmetro.
    • Esta função passará a request para a operação de rota correspondente.
    • Então ela retorna a response gerada pela operação de rota correspondente.
  • Você pode então modificar ainda mais o response antes de retorná-lo.
import time

from fastapi import FastAPI, Request

app = FastAPI()


@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start_time = time.perf_counter()
    response = await call_next(request)
    process_time = time.perf_counter() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

"Dica"

Tenha em mente que cabeçalhos proprietários personalizados podem ser adicionados usando o prefixo 'X-'.

Mas se você tiver cabeçalhos personalizados desejando que um cliente em um navegador esteja apto a ver, você precisa adicioná-los às suas configurações CORS (CORS (Cross-Origin Resource Sharing)) usando o parâmetro expose_headers documentado em Documentos CORS da Starlette.

"Detalhes técnicos"

Você também pode usar from starlette.requests import Request.

FastAPI fornece isso como uma conveniência para você, o desenvolvedor. Mas vem diretamente da Starlette.

Antes e depois da response

Você pode adicionar código para ser executado com a request, antes que qualquer operação de rota o receba.

E também depois que a response é gerada, antes de retorná-la.

Por exemplo, você pode adicionar um cabeçalho personalizado X-Process-Time contendo o tempo em segundos que levou para processar a solicitação e gerar uma resposta:

import time

from fastapi import FastAPI, Request

app = FastAPI()


@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start_time = time.perf_counter()
    response = await call_next(request)
    process_time = time.perf_counter() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

Outros middlewares

Mais tarde, você pode ler mais sobre outros middlewares no Guia do usuário avançado: Middleware avançado.

Você lerá sobre como manipular CORS com um middleware na próxima seção.