개요
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 |