python 通信中间件_Python Web框架Sanic middleware – 中间件

本文介绍了Python Web框架Sanic中如何使用middleware处理请求和响应。中间件可以在请求到达路由处理函数之前或响应返回之后进行操作,可以修改request和response对象。文中给出了添加请求头部、防止XSS攻击等中间件的示例,并解释了如何提前返回响应以终止请求处理流程。
摘要由CSDN通过智能技术生成

中间件是在服务器接受请求之前或之后执行的函数。它们用于修改传递给路由处理函数的

request

,或是由处理函数生成的

response

对象。

4bec0e84a0ecfb82dc1db3b2e18bcf3e.png

中间件类型

中间件有两种类型:

request

response

,都是通过

@app.middleware

修饰器来声明的,以修饰器的字符串参数

request

response

来表示这两种类型。

请求中间件只接受

request

对象作为参数。

响应中间件同时接受

request

response

两个对象作为参数。

下面是一个最简单的中间件的例子,它没有改变request和response,只是打印了信息:

@app.middleware('request')

async def print_on_request(request):

print("I print when a request is received by the server")

@app.middleware('response')

async def print_on_response(request, response):

print("I print when a response is returned by the server")

修改request或response

中间件可以修改作为参数传递的request或response,但不需要返回它们,参见下面的例子:

from sanic import Sanic

from sanic import response

app = Sanic(__name__)

@app.middleware('request')

async def add_key(request):

# Add a key to request object like dict object

request['foo'] = 'bar'

@app.middleware('response')

async def custom_banner(request, response):

response.headers["Server"] = "Fake-Server"

@app.middleware('response')

async def prevent_xss(request, response):

response.headers["x-xss-protection"] = "1; mode=block"

@app.route('/')

async def home(request):

return response.text(request['foo'])

app.run(host="127.0.0.1", port=8888, debug=True)

上面的代码将按顺序应用3个中间件。第一个中间件

add_key

request

对象增加了一个新的键

foo

,这样可以工作是因为

request

对象可以像字典那样被操作。

第二个中间件

custom_banner

修改了HTTP响应的头,把

Server

设置成

Fake-Server

最后一个中间件

prevent_xss

添加了响应头以防止跨站点脚本(XSS)攻击。

response类型的中间件在路由处理函数(比如,本例中的

home()

返回

response

后被调用。

使用

curl

访问上面代码的链接:

curl -i http://127.0.0.1:8888

我们可以看到:

HTTP/1.1 200 OK

Connection: keep-alive

Keep-Alive: 5

x-xss-protection: 1; mode=block

Server: Fake-Server

Content-Length: 3

Content-Type: text/plain; charset=utf-8

bar

提前响应

这里的“提前”是指中间件直接返回

HTTPResponse

对象,这时请求将停止处理并返回response。如果这发生在request类型的中间件,路由处理函数将不会被调用。返回response将阻止后续的中间件继续执行。

比如:

@app.middleware('request')

async def halt_request(request):

return text('I halted the request')

@app.middleware('response')

async def halt_response(request, response):

return text('I halted the response')

因为中间件

halt_request

返回了

Response

对象,其后续的中间件

halt_response

就不会被执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值