中间件:可以理解为请求拦截器:客户端跟服务器的所有交互都会先经过中间件。可以理解为python的解释器。使用中间件可以去做一些前置的身份校验,或者统计服务端处理逻辑耗时等都是可以的
from fastapi import FastAPI, Request
from starlette.responses import JSONResponse
import time
app = FastAPI()
test = False
# fastAPI中间件: 所有请求都会经过这里然后才会被转发到对应的路由
@app.middleware("http")
async def other(request: Request, call_next):
if test:
start_time = time.perf_counter()
response = await call_next(request) # 这里会把客户端的请求传给对应路由
process_time = time.perf_counter() - start_time
logger.info(f'请求路径: {request.url.path}, 处理时间: {process_time} s')
return response
else:
return JSONResponse(status_code=200, content={"code": 403, "msg": "无效的 API Key"})
上述demo代码跟官网给出来的demo不完全一致:区别是: 增加了一个简单的校验逻辑,如果校验条件失败, 则直接返回。
这里有一个坑需要记录一下:中间件的生效顺序是逆向的,所以先注册的中间件最后才会生效,比如说你使用了fastAPI的跨域配置,由于跨域配置本身就是作为中间件的存在,则这个中间件的配置就必须要放到跨域配置之前去注册才会生效, 否则不会生效