中间件

Sanic的中间件可以被应用在Sanic实例上,与拦截修饰器不同,中间件会在所有请求与响应中运行。多个中间件将会按照定义顺序执行。中间件也是一个普通的函数,但是是使用.middleware()修饰器修饰的。.middleware()修饰器可以接受一个字符串参数,可以取"request""response"两个值,分别代表中间件函数应用在请求流程和响应流程中。应用在请求流程中的中间件只能接受一个Request类型的参数,而应用在响应流程中的中间件可以接受一个Request类型和一个HTTPResponse类型的参数。

用在请求流程中的中间件通常都会产生一些操作结果供后续处理使用,这些处理结果可以保存在request.ctx中传递给下一个中间件或者请求处理函数。而用在响应流程中的中间件可以直接对HTTPResponse参数做修改。但是要注意,如果在请求流程中的中间件中返回HTTPResponse实例,将会直接中断请求处理流程,跳过剩余的全部中间件和请求处理函数。

以下是两个中间件的示例。

# 请求流程的中间件
@app.middleware("request")
async def parse_token(request):
	request.ctx.parsed_token = parse(request.token)

# 响应流程的中间件
@app.middleware("response")
async def prevent_xss(request, response):
	response.headers["x-xss-protection"] = "1; mode=block"