Request 객체 직접 사용하기

Request 객체 직접 사용하기 (Using the Request Directly)

지금까지 우리는 요청에서 필요한 부분을 타입과 함께 선언해 왔어요. 경로 파라미터, 헤더, 쿠키 등이 그렇죠. 그렇게 선언하면 FastAPI가 데이터를 검증하고, 변환하고, API에 대한 문서를 자동으로 만들어 줘요.

하지만 Request 객체를 직접 접근해야 하는 상황도 있어요. 이번 장에서는 그 경우를 다뤄볼게요.

출처: 공식문서

Request 객체에 대해

FastAPI는 사실 그 아래에서 Starlette을 쓰고, 그 위에 여러 도구가 얹힌 형태예요. 그래서 필요할 때 Starlette의 Request 객체를 직접 쓸 수 있어요.

다만 이 말은, Request 객체에서 직접 데이터를 가져오면(예: 본문을 읽는 경우) FastAPI가 그 데이터를 검증하거나 변환하거나 문서화하지 않는다는 뜻이기도 해요.

반면에 평소처럼 선언한 다른 파라미터(예: Pydantic 모델의 본문)는 여전히 검증, 변환, 애너테이션 처리 등이 돼요.

그래도 특정 상황에서는 Request 객체를 얻는 게 유용해요.

Request 객체 직접 사용하기

경로 연산 함수 안에서 클라이언트의 IP 주소/호스트를 얻고 싶다고 상상해 볼게요.

그러려면 request에 직접 접근해야 해요.

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를 넘겨줄 줄 알아요.

— 이 경우 request 파라미터 옆에 경로 파라미터도 함께 선언하고 있음을 눈여겨보세요. 경로 파라미터 item_id는 여전히 추출되고, 검증되고, 지정된 타입으로 변환되고, OpenAPI로 문서화돼요.

다른 파라미터도 평소처럼 선언하면서, 추가로 Request도 받을 수 있어요.

Request 문서

Request 객체에 대한 더 자세한 내용은 공식 Starlette 문서에서 읽을 수 있어요.

참고 | 기술적 세부사항from starlette.requests import Request로 쓸 수도 있어요. FastAPI는 개발자인 여러분을 위해 그냥 바로 제공해 주는 것뿐이고, 실제로는 Starlette에서 온 거예요.

더 알아보기 (Learn more)