中间件
前言
在Web开发中,通常需要一种机制处理请求前和响应后的一些钩子函数,通常把这类函数称为中间件。FastAPI的中间件是在应用程序处理HTTP请求和响应之前或之后执行功能的一个组件。中间件允许用户对HTTP请求进行重写、过滤、修改或添加信息,以及对HTTP响应进行修改或处理。
HTTP请求中间件
from fastapi import Request
# 为每个HTTP请求计算请求响应耗时, 并在控制台输出
@app.middleware("http")
async def add_process_time(request: Request, call_next):
start_time = time.time()
resp = await call_next(request)
process_time = time.time() - start_time
print(f"url: {request.url}, process_time: {process_time:.4f}")
return resp
CORS跨域中间件
在前后端分离架构中,经常会遇到跨域请求的问题。比如前端部署所在域名为web.ab.com,后端API部署的域名为api.ab.com,这是典型的非同源环境。在web.ab.com域名下访问api.ab.com,就会触发浏览器同源安全策略。这种安全策略策略是浏览器自带的基本安全策略。
在这种情况下,我们应该开启部分域名(或IP)来发起访问请求。常见跨域请求处理方法有:
- 使用代理机制,也就是通过同源服务器下的后端进行代理请求以获取非同源服务下的资源数据。
- 使用jsonp方式,但是jsonp方式仅限于GET请求。
- 使用CORS方式,相较于jsonp,CORS方式的优势在于支持的请求方式更多,浏览器兼容性更好。
FastAPI提供了CORSMiddleware中间件
from fastapi.middleware.cors import CORSMiddleware
origins = [
"https://api.ab.com",
"https://api2.ab.com",
"https://api3.ab.com:8080",
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins, # 允许跨域请求的域名列表
allow_credentials=True, # 跨域请求时是否允许发送跨域凭证, 一般为cookie
allow_methods=["*"], # 跨域允许的HTTP请求方法
allow_headers=["*"], # 跨域允许的HTTP请求头
)
HTTPSRedirectMiddleware
该内置中间件用于强制所有请求使用HTTPS。
from fastapi.middlerware.httpsredirect import HTTPSRedirectMiddlerware
app.add_middleware(HTTPSRedirectMiddlerware)
TrustedHostMiddlerware
某些场景下,需要强制请求Header中的host选项必须来自于指定的host才允许访问指定的地址。
示例
from fastapi.middleware.trustedhost import TrustedHostMiddleware
allowed_hosts = [
"exaple.com",
"*.example.com",
]
app.add_middleware(TrustedHostMiddleware, allowed_hosts = allowed_hosts)