콘텐츠로 이동

고급 미들웨어

메인 튜토리얼에서 Custom Middleware를 응용프로그램에 추가하는 방법을 읽으셨습니다.

그리고 CORS with the CORSMiddleware하는 방법도 보셨습니다.

이 섹션에서는 다른 미들웨어들을 사용하는 방법을 알아보겠습니다.

ASGI 미들웨어 추가하기

FastAPI는 Starlette을 기반으로 하고 있으며, ASGI 사양을 구현하므로 ASGI 미들웨어를 사용할 수 있습니다.

미들웨어가 FastAPI나 Starlette용으로 만들어지지 않아도 ASGI 사양을 준수하는 한 동작할 수 있습니다.

일반적으로 ASGI 미들웨어는 첫 번째 인수로 ASGI 앱을 받는 클래스들입니다.

따라서 타사 ASGI 미들웨어 문서에서 일반적으로 다음과 같이 사용하도록 안내할 것입니다.

from unicorn import UnicornMiddleware

app = SomeASGIApp()

new_app = UnicornMiddleware(app, some_config="rainbow")

하지만 내부 미들웨어가 서버 오류를 처리하고 사용자 정의 예외 처리기가 제대로 작동하도록 하는 더 간단한 방법을 제공하는 FastAPI(실제로는 Starlette)가 있습니다.

이를 위해 app.add_middleware()를 사용합니다(CORS의 예에서와 같이).

from fastapi import FastAPI
from unicorn import UnicornMiddleware

app = FastAPI()

app.add_middleware(UnicornMiddleware, some_config="rainbow")

app.add_middleware()는 첫 번째 인수로 미들웨어 클래스와 미들웨어에 전달할 추가 인수를 받습니다.

통합 미들웨어

FastAPI에는 일반적인 사용 사례를 위한 여러 미들웨어가 포함되어 있으며, 사용 방법은 다음에서 살펴보겠습니다.

/// note 참고 | “기술 세부 사항”

다음 예제에서는 from starlette.middleware.something import SomethingMiddleware를 사용할 수도 있습니다.

FastAPI는 개발자의 편의를 위해 fastapi.middleware에 여러 미들웨어를 제공합니다. 그러나 사용 가능한 대부분의 미들웨어는 Starlette에서 직접 제공합니다.

///

HTTPSRedirectMiddleware

들어오는 모든 요청이 https 또는 wss여야 합니다.

http 또는 ws로 들어오는 모든 요청은 대신 보안 체계로 리디렉션됩니다.

from fastapi import FastAPI
from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware

app = FastAPI()

app.add_middleware(HTTPSRedirectMiddleware)


@app.get("/")
async def main():
    return {"message": "Hello World"}

TrustedHostMiddleware

HTTP 호스트 헤더 공격을 방지하기 위해 모든 수신 요청에 올바르게 설정된 Host 헤더를 갖도록 강제합니다.

from fastapi import FastAPI
from fastapi.middleware.trustedhost import TrustedHostMiddleware

app = FastAPI()

app.add_middleware(
    TrustedHostMiddleware, allowed_hosts=["example.com", "*.example.com"]
)


@app.get("/")
async def main():
    return {"message": "Hello World"}

다음 인수가 지원됩니다:

  • allowed_hosts - 호스트 이름으로 허용해야 하는 도메인 이름 목록입니다. 일치하는 하위 도메인에 대해 *.example.com과 같은 와일드카드 도메인이 지원됩니다. 모든 호스트 이름을 허용하려면 allowed_hosts=[“*”]를 사용하거나 미들웨어를 생략하세요.

수신 요청의 유효성이 올바르게 확인되지 않으면 400이라는 응답이 전송됩니다.

GZipMiddleware

Accept-Encoding 헤더에 “gzip”이 포함된 모든 요청에 대해 GZip 응답을 처리합니다.

미들웨어는 표준 응답과 스트리밍 응답을 모두 처리합니다.

from fastapi import FastAPI
from fastapi.middleware.gzip import GZipMiddleware

app = FastAPI()

app.add_middleware(GZipMiddleware, minimum_size=1000, compresslevel=5)


@app.get("/")
async def main():
    return "somebigcontent"

지원되는 인수는 다음과 같습니다:

  • minimum_size - 이 최소 크기(바이트)보다 작은 응답은 GZip하지 않습니다. 기본값은 500입니다.
  • compresslevel - GZip 압축 중에 사용됩니다. 1에서 9 사이의 정수입니다. 기본값은 9입니다. 값이 낮을수록 압축 속도는 빨라지지만 파일 크기는 커지고, 값이 높을수록 압축 속도는 느려지지만 파일 크기는 작아집니다.

기타 미들웨어

다른 많은 ASGI 미들웨어가 있습니다.

예를 들어:

유비콘의 ProxyHeadersMiddleware> MessagePack

사용 가능한 다른 미들웨어를 확인하려면 스타렛의 미들웨어 문서ASGI Awesome List를 참조하세요.