* validated llm translation * validated llm translation * validated llm translation * validated llm translation * validated llm translation * validated llm translation * validated llm translation * validated llm translation * validated llm translation * validated llm translation * validated llm translation * validated llm translation * validated llm translation * validated llm translation * validated llm translation * validated llm translation * validated llm translation * fix non-Annotated in llm-prompt * rerun after a few changes in llm-prompt * fix non-Annotated * validated llm translation * fix llm translation * update outdated translations * fix translation for operation IDs * add header link * add missing link * fix line break * fix diff * fix llm translation * fix 'Atualize' to 'Atualizar' * update alternatives.md * update async.md * update fastapi-cli.md * update features.md * update help-fastapi.md * update history-design-future.md * update index.md * update advanced/events.md * update advanced/middleware.md * update advanced/response-cookies.md * update advanced/response-headers.md * update advanced/templates.md * update advanced/testing-websockets.md * update advanced/using-request-directly.md * update advanced/websockets.md * update advanced/security/oauth2-scopes.md * update deployment/cloud.md * update deployment/manually.md * update how-to/custom-request-and-route.md * update how-to/migrate-from-pydantic-v1-to-pydantic-v2.md * update tutorial/background-tasks.md * update tutorial/first-steps.md * update tutorial/handling-errors.md * update tutorial/middleware.md * update tutorial/request-files.md * update tutorial/sql-databases.md * update tutorial/static-files.md * update tutorial/testing.md * update tutorial/dependencies/dependencies-with-yield.md * update advanced/advanced-dependencies.md --------- Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com>
4.4 KiB
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.
/// note | 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 (abordada na seção Tarefas em segundo plano{.internal-link target=_blank}, que você verá mais adiante), 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_nextque receberá orequestcomo um parâmetro.- Esta função passará a
requestpara a operação de rota correspondente. - Então ela retorna a
responsegerada pela operação de rota correspondente.
- Esta função passará a
- Você pode então modificar ainda mais o
responseantes de retorná-lo.
{* ../../docs_src/middleware/tutorial001.py hl[8:9,11,14] *}
/// tip | 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){.internal-link target=_blank}) usando o parâmetro expose_headers documentado em Documentos CORS da Starlette.
///
/// note | 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:
{* ../../docs_src/middleware/tutorial001.py hl[10,12:13] *}
/// tip | Dica
Aqui usamos time.perf_counter() em vez de time.time() porque ele pode ser mais preciso para esses casos de uso. 🤓
///
Ordem de execução de múltiplos middlewares
Quando você adiciona múltiplos middlewares usando o decorador @app.middleware() ou o método app.add_middleware(), cada novo middleware envolve a aplicação, formando uma pilha. O último middleware adicionado é o mais externo, e o primeiro é o mais interno.
No caminho da requisição, o middleware mais externo roda primeiro.
No caminho da resposta, ele roda por último.
Por exemplo:
app.add_middleware(MiddlewareA)
app.add_middleware(MiddlewareB)
Isso resulta na seguinte ordem de execução:
-
Requisição: MiddlewareB → MiddlewareA → rota
-
Resposta: rota → MiddlewareA → MiddlewareB
Esse comportamento de empilhamento garante que os middlewares sejam executados em uma ordem previsível e controlável.
Outros middlewares
Mais tarde, você pode ler mais sobre outros middlewares no Guia do usuário avançado: Middleware avançado{.internal-link target=_blank}.
Você lerá sobre como manipular CORS com um middleware na próxima seção.