python middleware_Sanic middleware – 中间件
中间件是在服务器接受请求之前或之后执行的函数。它们用于修改传递给路由处理函数的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 – 中间件相关推荐
- ASP.NET MVC随想录——创建自定义的Middleware中间件
经过前2篇文章的介绍,相信大家已经对OWIN和Katana有了基本的了解,那么这篇文章我将继续OWIN和Katana之旅--创建自定义的Middleware中间件. 何为Middleware中间件 M ...
- ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)
在上一节(ASP.NET Core 运行原理剖析1:初始化WebApp模版并运行)中提到ASP.NET Core WebApp 必须含有Startup类,在本节中将重点讲解Startup类以及Midd ...
- thinkphp6框架middleware中间件的定义和使用方法示例
thinkphp6框架middleware中间件的定义和使用方法示例 中间件 定义中间件 配置中间件 前置/后置中间件 前置行为的中间件 后置行为的中间件 中间件向控制器传参 内置中间件 中间件 中间 ...
- PHP中间件 middleware,Laravel框架控制器的middleware中间件用法分析
本文实例讲述了Laravel框架控制器的middleware中间件用法.分享给大家供大家参考,具体如下: 场景:活动开始前只能访问宣传页面,开始后才可以访问其他页面: 步骤: 新建中间件, 注册中间件 ...
- middlewareserver_创建自定义的Middleware中间件
经过前2篇文章的介绍,相信大家已经对OWIN和Katana有了基本的了解,那么这篇文章我将继续OWIN和Katana之旅--创建自定义的Middleware中间件. 何为Middleware中间件 M ...
- python 通信中间件_Python Web框架Sanic middleware – 中间件
中间件是在服务器接受请求之前或之后执行的函数.它们用于修改传递给路由处理函数的 request ,或是由处理函数生成的 response 对象. 中间件类型 中间件有两种类型: request 和 r ...
- Laravel 5.0 - Middleware (中间件)
2019独角兽企业重金招聘Python工程师标准>>> 图片:http://stackphp.com/ 如上图所示,中心的绿色区域是整个应用的核心区域. 所以,中间件就是一系列处理请 ...
- 【python】-- Django 中间件、缓存、信号
Django 中间件.缓存.信号 一. Django 中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的 ...
- Jerry的CRM Middleware(中间件)文章合集
我在SAP成都研究院做过的CRM中间件的项目其实并不是很多: 1. 2013年下半年和2014年上半年曾经支持过中联重科和蒙牛的CRM项目相关的中间件问题; 2. 2014年上半年做过一个CRM物料主 ...
最新文章
- 关于加密、签名、证书的作用及运用场景
- 获得AndroidManifest.xml文件中meta-data的value值
- arcengine 加载地图不显示_用LSV下载城市地图、全省地图教程
- MapReduce 在Shuffle阶段 内存溢出原因分析及处理方法
- BCH码和m序列参数估计(梅西迭代算法求多项式的MATLAB实现)
- 【Antlr】Antlr 自动错误恢复机制
- 陕西机关事业单位工勤计算机考试成绩,2020年陕西省机关事业单位工人技术等级岗位考核公告发布 6月22日开始报名 9月中旬以后考核...
- java(19) - 反射机制
- java规范 控制语句
- 一篇价值过百万的日志
- 控制台命令调试(bt)
- 无刷直流电机常用计算公式
- 机器视觉(9)搞懂机器视觉基本内容,这份PPT就够了!
- MOOC-浙江大学-博弈论基础-学习笔记(四)
- 《程序员》12月精彩内容:双11技术决战
- 什么是数学建模?如何在数学建模中拿奖?通过建模学到了啥?
- Qt编写可视化大屏电子看板系统13-基础版
- 级联失效matlab,加权无标度网络的级联失效模型
- PAT 甲级1003 Emergency 题解
- go实现dgraph的各种操作
热门文章
- led透明屏生产厂家_如何实现LED双面透明显示屏,双面LED透明屏
- Valid signing identity not found解决办法(原有IDP私钥丢失)
- windows 执行bat脚本
- Cisco 2811 IOS 升级实战
- 使用Xamarin.Forms的企业应用程序模式(电子书)--依赖注入
- 24. [Ext JS 4] 实战之Load Mask(加载遮罩)的显示与隐藏
- 最近很火的百度MIP之 zblog改造
- 【HDOJ】1150 Machine Schedule
- 系统弹出菜单类名是固定的. #32769
- VCard 通信薄格式说明