Utilizando o Request diretamente¶
Até agora você declarou as partes da requisição que você precisa utilizando os seus tipos.
Obtendo dados de:
- Os parâmetros das rotas.
- Cabeçalhos (Headers).
- Cookies.
- etc.
E ao fazer isso, o FastAPI está validando as informações, convertendo-as e gerando documentação para a sua API automaticamente.
Porém há situações em que você possa precisar acessar o objeto Request
diretamente.
Detalhes sobre o objeto Request
¶
Como o FastAPI é na verdade o Starlette por baixo, com camadas de diversas funcionalidades por cima, você pode utilizar o objeto Request
do Starlette diretamente quando precisar.
Isso significaria também que se você obtiver informações do objeto Request
diretamente (ler o corpo da requisição por exemplo), as informações não serão validadas, convertidas ou documentadas (com o OpenAPI, para a interface de usuário automática da API) pelo FastAPI.
Embora qualquer outro parâmetro declarado normalmente (o corpo da requisição com um modelo Pydantic, por exemplo) ainda seria validado, convertido, anotado, etc.
Mas há situações específicas onde é útil utilizar o objeto Request
.
Utilize o objeto Request
diretamente¶
Vamos imaginar que você deseja obter o endereço de IP/host do cliente dentro da sua função de operação de rota.
Para isso você precisa acessar a requisição diretamente.
from fastapi import FastAPI, Request
app = FastAPI()
@app.get("/items/{item_id}")
def read_root(item_id: str, request: Request):
client_host = request.client.host
return {"client_host": client_host, "item_id": item_id}
Ao declarar o parâmetro com o tipo sendo um Request
em sua função de operação de rota, o FastAPI saberá como passar o Request
neste parâmetro.
Dica
Note que neste caso, nós estamos declarando o parâmetro da rota ao lado do parâmetro da requisição.
Assim, o parâmetro da rota será extraído, validado, convertido para o tipo especificado e anotado com OpenAPI.
Do mesmo jeito, você pode declarar qualquer outro parâmetro normalmente, e além disso, obter o Request
também.
Documentação do Request
¶
Você pode ler mais sobre os detalhes do objeto Request
no site da documentação oficial do Starlette..
Detalhes Técnicos
Você também pode utilizar from starlette.requests import Request
.
O FastAPI fornece isso diretamente apenas como uma conveniência para você, o desenvolvedor. Mas ele vem diretamente do Starlette.