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

中间件类型

中间件有两种类型: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就不会被执行。

我的公众号:猿人学 Python 上会分享更多心得体会,敬请关注。

***版权申明:若没有特殊说明,文章皆是猿人学 yuanrenxue.com 原创,没有猿人学授权,请勿以任何形式转载。***

python middleware_Sanic middleware – 中间件相关推荐

  1. ASP.NET MVC随想录——创建自定义的Middleware中间件

    经过前2篇文章的介绍,相信大家已经对OWIN和Katana有了基本的了解,那么这篇文章我将继续OWIN和Katana之旅--创建自定义的Middleware中间件. 何为Middleware中间件 M ...

  2. ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)

    在上一节(ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行)中提到ASP.NET Core WebApp 必须含有Startup类,在本节中将重点讲解Startup类以及Midd ...

  3. thinkphp6框架middleware中间件的定义和使用方法示例

    thinkphp6框架middleware中间件的定义和使用方法示例 中间件 定义中间件 配置中间件 前置/后置中间件 前置行为的中间件 后置行为的中间件 中间件向控制器传参 内置中间件 中间件 中间 ...

  4. PHP中间件 middleware,Laravel框架控制器的middleware中间件用法分析

    本文实例讲述了Laravel框架控制器的middleware中间件用法.分享给大家供大家参考,具体如下: 场景:活动开始前只能访问宣传页面,开始后才可以访问其他页面: 步骤: 新建中间件, 注册中间件 ...

  5. middlewareserver_创建自定义的Middleware中间件

    经过前2篇文章的介绍,相信大家已经对OWIN和Katana有了基本的了解,那么这篇文章我将继续OWIN和Katana之旅--创建自定义的Middleware中间件. 何为Middleware中间件 M ...

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

    中间件是在服务器接受请求之前或之后执行的函数.它们用于修改传递给路由处理函数的 request ,或是由处理函数生成的 response 对象. 中间件类型 中间件有两种类型: request 和 r ...

  7. Laravel 5.0 - Middleware (中间件)

    2019独角兽企业重金招聘Python工程师标准>>> 图片:http://stackphp.com/ 如上图所示,中心的绿色区域是整个应用的核心区域. 所以,中间件就是一系列处理请 ...

  8. 【python】-- Django 中间件、缓存、信号

    Django  中间件.缓存.信号 一. Django  中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的 ...

  9. Jerry的CRM Middleware(中间件)文章合集

    我在SAP成都研究院做过的CRM中间件的项目其实并不是很多: 1. 2013年下半年和2014年上半年曾经支持过中联重科和蒙牛的CRM项目相关的中间件问题; 2. 2014年上半年做过一个CRM物料主 ...

最新文章

  1. 关于加密、签名、证书的作用及运用场景
  2. 获得AndroidManifest.xml文件中meta-data的value值
  3. arcengine 加载地图不显示_用LSV下载城市地图、全省地图教程
  4. MapReduce 在Shuffle阶段 内存溢出原因分析及处理方法
  5. BCH码和m序列参数估计(梅西迭代算法求多项式的MATLAB实现)
  6. 【Antlr】Antlr 自动错误恢复机制
  7. 陕西机关事业单位工勤计算机考试成绩,2020年陕西省机关事业单位工人技术等级岗位考核公告发布 6月22日开始报名 9月中旬以后考核...
  8. java(19) - 反射机制
  9. java规范 控制语句
  10. 一篇价值过百万的日志
  11. 控制台命令调试(bt)
  12. 无刷直流电机常用计算公式
  13. 机器视觉(9)搞懂机器视觉基本内容,这份PPT就够了!
  14. MOOC-浙江大学-博弈论基础-学习笔记(四)
  15. 《程序员》12月精彩内容:双11技术决战
  16. 什么是数学建模?如何在数学建模中拿奖?通过建模学到了啥?
  17. Qt编写可视化大屏电子看板系统13-基础版
  18. 级联失效matlab,加权无标度网络的级联失效模型
  19. PAT 甲级1003 Emergency 题解
  20. go实现dgraph的各种操作

热门文章

  1. led透明屏生产厂家_如何实现LED双面透明显示屏,双面LED透明屏
  2. Valid signing identity not found解决办法(原有IDP私钥丢失)
  3. windows 执行bat脚本
  4. Cisco 2811 IOS 升级实战
  5. 使用Xamarin.Forms的企业应用程序模式(电子书)--依赖注入
  6. 24. [Ext JS 4] 实战之Load Mask(加载遮罩)的显示与隐藏
  7. 最近很火的百度MIP之 zblog改造
  8. 【HDOJ】1150 Machine Schedule
  9. 系统弹出菜单类名是固定的. #32769
  10. VCard 通信薄格式说明