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 패키지만 설치하고, WSGIMiddlewarea2wsgi에서 올바르게 임포트하면 돼요.

확인해 보기 (Check it)

이제 /v1/ 경로 아래의 모든 요청은 Flask 애플리케이션이 처리해요. 나머지는 FastAPI가 처리하고요.

실행하고 http://localhost:8000/v1/에 접속하면 Flask의 응답이 보여요:

Hello, World from Flask!

그리고 http://localhost:8000/v2에 접속하면 FastAPI의 응답이 보여요:

{
    "message": "Hello World"
}

더 알아보기 (Learn more)