콘텐츠로 이동

미들웨어

미들웨어를 FastAPI 응용 프로그램에 추가할 수 있습니다.

"미들웨어"는 특정 경로 작동에 의해 처리되기 전, 모든 요청에 대해서 동작하는 함수입니다. 또한 모든 응답이 반환되기 전에도 동일하게 동작합니다.

  • 미들웨어는 응용 프로그램으로 오는 요청를 가져옵니다.
  • 요청 또는 다른 필요한 코드를 실행 시킬 수 있습니다.
  • 요청을 응용 프로그램의 경로 작동으로 전달하여 처리합니다.
  • 애플리케이션의 경로 작업에서 생성한 응답를 받습니다.
  • 응답 또는 다른 필요한 코드를 실행시키는 동작을 할 수 있습니다.
  • 응답를 반환합니다.

기술 세부사항

만약 yield를 사용한 의존성을 가지고 있다면, 미들웨어가 실행되고 난 후에 exit이 실행됩니다.

만약 (나중에 문서에서 다룰) 백그라운드 작업이 있다면, 모든 미들웨어가 실행되고 난 후에 실행됩니다.

미들웨어 만들기

미들웨어를 작성하기 위해서 함수 상단에 @app.middleware("http") 데코레이터를 사용할 수 있습니다.

미들웨어 함수는 다음 항목들을 받습니다:

  • request.
  • request를 매개변수로 받는 call_next 함수.
    • 이 함수는 request를 해당하는 경로 작업으로 전달합니다.
    • 그런 다음, 경로 작업에 의해 생성된 response 를 반환합니다.
  • response를 반환하기 전에 추가로 response를 수정할 수 있습니다.
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.time()
    response = await call_next(request)
    process_time = time.time() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

사용자 정의 헤더는 'X-' 접두사를 사용하여 추가할 수 있습니다.

그러나 만약 클라이언트의 브라우저에서 볼 수 있는 사용자 정의 헤더를 가지고 있다면, 그것들을 CORS 설정(CORS (Cross-Origin Resource Sharing))에 Starlette CORS 문서에 명시된 expose_headers 매개변수를 이용하여 헤더들을 추가하여야합니다.

기술적 세부사항

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

FastAPI는 개발자에게 편의를 위해 이를 제공합니다. 그러나 Starlette에서 직접 파생되었습니다.

response의 전과 후

경로 작동을 받기 전 request와 함께 작동할 수 있는 코드를 추가할 수 있습니다.

그리고 response 또한 생성된 후 반환되기 전에 코드를 추가 할 수 있습니다.

예를 들어, 요청을 수행하고 응답을 생성하는데 까지 걸린 시간 값을 가지고 있는 X-Process-Time 같은 사용자 정의 헤더를 추가할 수 있습니다.

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.time()
    response = await call_next(request)
    process_time = time.time() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

다른 미들웨어

미들웨어에 대한 더 많은 정보는 숙련된 사용자 안내서: 향상된 미들웨어에서 확인할 수 있습니다.

다음 부분에서 미들웨어와 함께 CORS를 어떻게 다루는지에 대해 확인할 것입니다.