跳到内容

高级中间件

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

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

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

添加 ASGI 中间件

由于FastAPI基于Starlette并实现了ASGI规范,您可以安全地使用任何ASGI中间件。

只要遵循ASGI规范,一个中间件不必是为了FastAPI或Starlette而创建才能工作。

通常,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

FastAPIfastapi.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=["*"]或省略该中间件。
  • www_redirect - 如果设置为True,对非www版本的允许主机名进行的请求将被重定向到其www版本。默认为True

如果传入请求未能正确验证,则会发送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 - 不对小于此最小字节数(以字节为单位)的响应进行GZip压缩。默认为500
  • compresslevel - 在GZip压缩期间使用。它是一个介于1到9之间的整数。默认为9。较低的值会更快地压缩但文件尺寸较大,而较高的值会更慢地压缩但文件尺寸较小。

其他中间件

还有许多其他ASGI中间件。

例如

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