WSGI 앱 포함하기
WSGI 앱 포함하기 (Including WSGI - Flask, Django)
기존에 Flask나 Django 같은 WSGI 기반 앱이 있고, 이걸 FastAPI 안에 함께 두고 싶을 때가 있어요. 마이그레이션을 단계적으로 진행할 때 특히 유용하죠. 하위 애플리케이션 마운트에서 본 것처럼 WSGI 앱도 마운트할 수 있어요.
그러려면 WSGIMiddleware를 써서 WSGI 앱을 감싸면 돼요.
출처: 공식문서
WSGIMiddleware 사용하기
참고 — 이걸 쓰려면 프로젝트에
a2wsgi를 추가해야 해요. 예를 들어uv add a2wsgi처럼요.
a2wsgi에서 WSGIMiddleware를 임포트해요. 그다음 WSGI(예: Flask) 앱을 미들웨어로 감싸고, 특정 경로 아래에 마운트하면 돼요.
from a2wsgi import WSGIMiddleware
from fastapi import FastAPI
from flask import Flask, request
from markupsafe import escape
flask_app = Flask(__name__)
@flask_app.route("/")
def flask_main():
name = request.args.get("name", "World")
return f"Hello, {escape(name)} from Flask!"
app = FastAPI()
@app.get("/v2")
def read_main():
return {"message": "Hello World"}
app.mount("/v1", WSGIMiddleware(flask_app))
app.mount("/v1", WSGIMiddleware(flask_app))에서 /v1 경로 아래의 요청은 Flask 앱이, 그 외의 요청은 FastAPI가 처리하게 돼요. /v2의 FastAPI 경로 연산과 /을 가진 Flask 앱이 충돌하지 않고 깔끔하게 나뉘는 거죠.
참고 — 이전에는
fastapi.middleware.wsgi에서WSGIMiddleware를 쓰는 걸 권장했지만, 지금은 더 이상 권장하지 않아요(deprecated). 대신a2wsgi패키지를 쓰는 게 좋아요. 사용법은 동일해요.a2wsgi패키지만 설치하고,WSGIMiddleware를a2wsgi에서 올바르게 임포트하면 돼요.
확인해 보기 (Check it)
이제 /v1/ 경로 아래의 모든 요청은 Flask 애플리케이션이 처리해요. 나머지는 FastAPI가 처리하고요.
실행하고 http://localhost:8000/v1/에 접속하면 Flask의 응답이 보여요:
Hello, World from Flask!
그리고 http://localhost:8000/v2에 접속하면 FastAPI의 응답이 보여요:
{
"message": "Hello World"
}