고급 미들웨어¶
메인 튜토리얼에서 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에는 일반적인 사용 사례를 위한 여러 미들웨어가 포함되어 있으며, 사용 방법은 다음에서 살펴보겠습니다.
기술 세부 사항
다음 예제에서는 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를 참조하세요.