콘텐츠로 이동

Request 직접 사용하기

지금까지 요청에서 필요한 부분을 각 타입으로 선언하여 사용해 왔습니다.

다음과 같은 곳에서 데이터를 가져왔습니다:

  • 경로의 파라미터로부터.
  • 헤더.
  • 쿠키.
  • 기타 등등.

이렇게 함으로써, FastAPI는 데이터를 검증하고 변환하며, API에 대한 문서를 자동화로 생성합니다.

하지만 Request 객체에 직접 접근해야 하는 상황이 있을 수 있습니다.

Request 객체에 대한 세부 사항

FastAPI는 실제로 내부에 Starlette을 사용하며, 그 위에 여러 도구를 덧붙인 구조입니다. 따라서 여러분이 필요할 때 Starlette의 Request 객체를 직접 사용할 수 있습니다.

Request 객체에서 데이터를 직접 가져오는 경우(예: 본문을 읽기)에는 FastAPI가 해당 데이터를 검증하거나 변환하지 않으며, 문서화(OpenAPI를 통한 문서 자동화(로 생성된) API 사용자 인터페이스)도 되지 않습니다.

그러나 다른 매개변수(예: Pydantic 모델을 사용한 본문)는 여전히 검증, 변환, 주석 추가 등이 이루어집니다.

하지만 특정한 경우에는 Request 객체에 직접 접근하는 것이 유용할 수 있습니다.

Request 객체를 직접 사용하기

여러분이 클라이언트의 IP 주소/호스트 정보를 경로 작동 함수 내부에서 가져와야 한다고 가정해 보겠습니다.

이를 위해서는 요청에 직접 접근해야 합니다.

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}

경로 작동 함수 매개변수를 Request 타입으로 선언하면 FastAPI가 해당 매개변수에 Request 객체를 전달하는 것을 알게 됩니다.

이 경우, 요청 매개변수와 함께 경로 매개변수를 선언한 것을 볼 수 있습니다.

따라서, 경로 매개변수는 추출되고 검증되며 지정된 타입으로 변환되고 OpenAPI로 주석이 추가됩니다.

이와 같은 방식으로, 다른 매개변수들을 평소처럼 선언하면서, 부가적으로 Request도 가져올 수 있습니다.

Request 설명서

여러분은 Request 객체에 대한 더 자세한 내용을 공식 Starlette 설명서 사이트에서 읽어볼 수 있습니다.

기술 세부사항

from starlette.requests import Request를 사용할 수도 있습니다.

FastAPI는 여러분(개발자)를 위한 편의를 위해 이를 직접 제공하지만, 실제로는 Starlette에서 가져온 것입니다.