高级中间件¶
在主教程中,您了解了如何将 自定义中间件 添加到您的应用程序。
然后您还了解了如何处理 使用 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
。
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
¶
强制所有传入请求都具有正确设置的 Host
标头,以防止 HTTP 主机标头攻击。
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。