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

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 – 中间件相关推荐

  1. 自定义python框架_Python web 框架Sanic 学习: 自定义 Exception

    Sanic 是一个和类Flask 的基于Python3.5+的web框架,它使用了 Python3 异步特性,有远超 flask 的性能. 编写 RESTful API 的时候,我们会定义特定的异常错 ...

  2. python sanic视频_Python Web框架Sanic 静态文件

    我们在写web app(网站)的时候会用到很多静态文件,比如css,JavaScript,图片等,这些文件及其文件夹可以通过 app.static() 方法注册,从而被访问到.该方法有两个必需参数,节 ...

  3. python 视图对象_python web框架篇:views视图函数

    Django请求的生命周期是怎样的? 简单地说,通过URL对应关系匹配 ->找到对应的函数(或者类)->返回字符串(或者读取Html之后返回渲染的字符串) 解剖起来如下: 1. 当用户在浏 ...

  4. 『Python学习笔记』Python中的异步Web框架之fastAPI介绍RestAPI

    Python中的异步Web框架之fastAPI介绍&RestAPI 文章目录 一. fastAPI简要介绍 1.1. 安装 1.2. 创建 1.3. get方法 1.4. post方法 1.5 ...

  5. python框架sanic_Python Web框架Sanic框架初识

    Sanic 既是一个Python web 服务器,又是一个web框架,它为速度而生.Sanic只支持Python 3.5及其以上版本,允许我们使用 async/await 语法来使我们的代码非阻塞且快 ...

  6. python爬虫对比_Python六大框架对比,Web2py略胜一筹|python爬虫|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ Python是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的 ...

  7. python web-Python的哪个Web框架学习周期短,学习成本低?

    不用学前端编程,你就能用 Python 简单高效写出漂亮的交互式 Web 应用,将你的数据分析成果立即展示给团队和客户. /> 痛点 从我开始折腾数据分析工具的那一天,就没有想明白一件事儿 -- ...

  8. django 业务逻辑写在view里吗?_Python Web框架Django简介

    引言 我们都知道,Django是一种基于Python的Web开发框架. 那么,什么是Web开发?Web开发指的是开发基于B/S架构,通过前后端的配合,将后台服务器的数据在浏览器上展现给前台用户的应用. ...

  9. 畅游Python 二十一:Web框架 - Tornado

    Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了能有效 ...

最新文章

  1. java中IO流用到了哪种设计模式
  2. 独家下载!《零售数据中台通关指南》,带你玩转新零售
  3. leetCode #26 Remove Duplicates from Sorted Array
  4. php如何上传txt文件,并且读取txt文件
  5. 杠上百度?今日头条也做起搜索来了 | 畅言
  6. java调用Dos命令
  7. 职工工作量c语言调试分析,c语言职工工作量统计
  8. 火山安卓简单分组列表框
  9. Prelude CC 2019 for Mac附激活补丁 v8.1.0中文版
  10. LED显示屏智能化监控运维管理解决方案
  11. 企业微信群机器人入门
  12. Fedora20在神州战神K650D1安装过程,使用netinstall和Dvd.iso镜像安装。
  13. Spring Cloud 出现No instances available for user-service异常
  14. MATH1013总结
  15. 公司内网与外网同时使用
  16. 例3.2、计算存款利息。有1000元,想存一年。有三种方法可选:(1)活期,年利率为r1;(2)一年期定期,年利率为r2;(3)存两次半年定期,年利率为r3。请分别计算出一年后按3种方法所得到的本息和
  17. 为什么蘑菇丁会显示服务器繁忙,浅谈蘑菇丁自动打卡
  18. define和sbit的区别
  19. 群雄当立,逐鹿分布(三)Paxos传说之三大神器
  20. Ubuntu截图软件flameshot命令行下载

热门文章

  1. 缓存穿透、缓存雪崩、缓存击穿的原因及解决方案
  2. Django中加载static无法成功的解决方法
  3. Qt之高DPI显示器(二) - 自适配解决方案分析
  4. 关于形如--error LNK2005: xxx 已经在 msvcrtd.lib ( MSVCR90D.dll ) 中定义--的问题分析解决
  5. SQL Server:CASE WHEN OREN ELSE END =不支持OR
  6. eclipse 恢复默认窗口
  7. mysql5.7 解压版 中文乱码_MySQL 5.7解压版安装、卸载及乱码问题的图文解决方法...
  8. win11更新后黑屏怎么办 Windows11更新后黑屏的解决方法
  9. Android:模拟器使用命令安装apk
  10. makefile中 = ,:=,+=有怎么区别?