본문으로 바로가기

FastAPI add_middleware() 관련 이슈

category Coding/Python 2022. 7. 23. 12:15
반응형

개요

FastAPI에서 일반적으로 미들웨어를 설정하는 경우 add_middleware() 메소드를 활용한다. 하지만 https://github.com/tiangolo/fastapi/issues/5071 깃헙 이슈에 따르면 해당 메소드의 경우 호출할 때 마다 미들웨어를 re-initialize하는 이슈가 있다고 한다. 따라서 Middleware클래스를 활용하여 넣어주는 방식으로 변경하는게 좋다고 나와있고 본 포스팅에서는 관련된 내용을 간단하게 담아본다.

Middleware 클래스

일반적인 미들웨어 세팅 방식은 다음과 같다.

app = FastAPI()
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

FastAPI를 생성하고 해당 인스턴스의 메소드인 add_middleware() 를 통해 미들웨어를 세팅하는 방식이다. 하지만 위와 같은 형태로 구성한다면 해당 메소드가 호출될 때 마다 다시 한번 초기화를 진행하는 이슈가 있다고 한다. 따라서 Middleware 클래스를 활용해줘야 한다.

from fastapi.middleware import Middleware


Middleware(SQLAlchemyMiddleware)

먼저 위처럼 Middleware 형태로 감싸준다.

from fastapi.middleware import Middleware


Middleware(SQLAlchemyMiddleware, user_id=1, context={})

만약 추가적인 인자가 필요하다면 첫 번째 인자 이후에 넣어준다.

app = FastAPI(
    ...
    middleware=[Middleware(SQLAlchemyMiddleware)]
)

그리고 FastAPI 인스턴스를 생성하는 당시에 middleware의 인자로 넣어주면 된다. 주의할점은 해당 인자는 리스트 타입을 인자로 받기 때문에 리스트로 한번 감싸서 넣어줘야한다는 점이다.

추가적으로, 현재는 해결된 이슈인지는 모르겠는데 특정 버전까지는 add_middleware()로 미들웨어를 세팅해준 경우 순서가 역순으로 적용된다. 예를 들어서,

app.add_middleware(A)
app.add_middleware(B)
app.add_middleware(C)

위와 같이 세팅한다면 미들웨어는 C->B->A 순서대로 세팅된다. Request가 들어왔을 때 처음 실행되는 미들웨어는 C라는 점이다. 하지만 FastAPI의 middleware인자를 통해 세팅하는 경우 이와 다르게 입력한 순서대로 미들웨어가 실행된다.

'Coding > Python' 카테고리의 다른 글

ASGI와 HTTP  (0) 2022.11.24
FastAPI BaseHTTPMiddleware 관련 이슈  (0) 2022.07.23
Python Generic Type  (0) 2022.07.07
Python Metaclass 사용해보기  (0) 2022.07.06
SQLAlchemy AsyncSession으로 비동기 적용하기  (3) 2022.03.18