python 通信中间件_Python Web框架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 通信中间件_Python Web框架Sanic middleware – 中间件相关推荐
- 自定义python框架_Python web 框架Sanic 学习: 自定义 Exception
Sanic 是一个和类Flask 的基于Python3.5+的web框架,它使用了 Python3 异步特性,有远超 flask 的性能. 编写 RESTful API 的时候,我们会定义特定的异常错 ...
- python sanic视频_Python Web框架Sanic 静态文件
我们在写web app(网站)的时候会用到很多静态文件,比如css,JavaScript,图片等,这些文件及其文件夹可以通过 app.static() 方法注册,从而被访问到.该方法有两个必需参数,节 ...
- python 视图对象_python web框架篇:views视图函数
Django请求的生命周期是怎样的? 简单地说,通过URL对应关系匹配 ->找到对应的函数(或者类)->返回字符串(或者读取Html之后返回渲染的字符串) 解剖起来如下: 1. 当用户在浏 ...
- 『Python学习笔记』Python中的异步Web框架之fastAPI介绍RestAPI
Python中的异步Web框架之fastAPI介绍&RestAPI 文章目录 一. fastAPI简要介绍 1.1. 安装 1.2. 创建 1.3. get方法 1.4. post方法 1.5 ...
- python框架sanic_Python Web框架Sanic框架初识
Sanic 既是一个Python web 服务器,又是一个web框架,它为速度而生.Sanic只支持Python 3.5及其以上版本,允许我们使用 async/await 语法来使我们的代码非阻塞且快 ...
- python爬虫对比_Python六大框架对比,Web2py略胜一筹|python爬虫|python入门|python教程...
https://www.xin3721.com/eschool/pythonxin3721/ Python是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的 ...
- python web-Python的哪个Web框架学习周期短,学习成本低?
不用学前端编程,你就能用 Python 简单高效写出漂亮的交互式 Web 应用,将你的数据分析成果立即展示给团队和客户. /> 痛点 从我开始折腾数据分析工具的那一天,就没有想明白一件事儿 -- ...
- django 业务逻辑写在view里吗?_Python Web框架Django简介
引言 我们都知道,Django是一种基于Python的Web开发框架. 那么,什么是Web开发?Web开发指的是开发基于B/S架构,通过前后端的配合,将后台服务器的数据在浏览器上展现给前台用户的应用. ...
- 畅游Python 二十一:Web框架 - Tornado
Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了能有效 ...
最新文章
- java中IO流用到了哪种设计模式
- 独家下载!《零售数据中台通关指南》,带你玩转新零售
- leetCode #26 Remove Duplicates from Sorted Array
- php如何上传txt文件,并且读取txt文件
- 杠上百度?今日头条也做起搜索来了 | 畅言
- java调用Dos命令
- 职工工作量c语言调试分析,c语言职工工作量统计
- 火山安卓简单分组列表框
- Prelude CC 2019 for Mac附激活补丁 v8.1.0中文版
- LED显示屏智能化监控运维管理解决方案
- 企业微信群机器人入门
- Fedora20在神州战神K650D1安装过程,使用netinstall和Dvd.iso镜像安装。
- Spring Cloud 出现No instances available for user-service异常
- MATH1013总结
- 公司内网与外网同时使用
- 例3.2、计算存款利息。有1000元,想存一年。有三种方法可选:(1)活期,年利率为r1;(2)一年期定期,年利率为r2;(3)存两次半年定期,年利率为r3。请分别计算出一年后按3种方法所得到的本息和
- 为什么蘑菇丁会显示服务器繁忙,浅谈蘑菇丁自动打卡
- define和sbit的区别
- 群雄当立,逐鹿分布(三)Paxos传说之三大神器
- Ubuntu截图软件flameshot命令行下载
热门文章
- 缓存穿透、缓存雪崩、缓存击穿的原因及解决方案
- Django中加载static无法成功的解决方法
- Qt之高DPI显示器(二) - 自适配解决方案分析
- 关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决
- SQL Server:CASE WHEN OREN ELSE END =不支持OR
- eclipse 恢复默认窗口
- mysql5.7 解压版 中文乱码_MySQL 5.7解压版安装、卸载及乱码问题的图文解决方法...
- win11更新后黑屏怎么办 Windows11更新后黑屏的解决方法
- Android:模拟器使用命令安装apk
- makefile中 = ,:=,+=有怎么区别?