Skip to content

高级中间件

在主教程中,您学习了如何为应用程序添加自定义中间件

然后,您还学习了如何使用CORSMiddleware处理CORS

在本节中,我们将了解如何使用其他中间件。

添加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

强制所有传入请求必须是httpswss

任何传入的httpws请求将被重定向到安全方案。

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

强制所有传入请求的Host头正确设置,以防止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

处理包含"gzip"Accept-Encoding头的任何请求的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 - 不压缩小于此最小大小的响应(以字节为单位)。默认为500
  • compresslevel - 在GZip压缩期间使用。它是一个从1到9的整数。默认为9。较低的值会导致更快的压缩但文件大小较大,而较高的值会导致更慢的压缩但文件大小较小。

其他中间件

还有许多其他ASGI中间件。

例如:

要查看其他可用的中间件,请查看Starlette的中间件文档ASGI Awesome List