10、fastAPI-中间件

22 阅读1分钟

中间件:可以理解为请求拦截器:客户端跟服务器的所有交互都会先经过中间件。可以理解为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的跨域配置,由于跨域配置本身就是作为中间件的存在,则这个中间件的配置就必须要放到跨域配置之前去注册才会生效, 否则不会生效