Sanic框架流式传输操作示例


Posted in Python onJuly 18, 2018

本文实例讲述了Sanic框架流式传输操作。分享给大家供大家参考,具体如下:

简介

Sanic是一个类似Flask的Python 3.5+ Web服务器,它的写入速度非常快。除了Flask之外,Sanic还支持异步请求处理程序。这意味着你可以使用Python 3.5中新的闪亮的异步/等待语法,使你的代码非阻塞和快速。

在前面一篇《Sanic框架Cookies操作》中已经讲到,如何在Sanic中使用Cookie,接下来将介绍一下Sanic的流的使用:

请求流式传输

Sanic允许通过流获取请求数据,如下所示,当请求结束时,request.stream.get()返回为None,只有postputpatch decorator拥有流参数:

from sanic.response import stream
@app.post("/post_stream",stream=True)
async def post_stream(request):
  async def streaming(response):
    while True:
      body = await request.stream.get()
      if body is None:
        break
      body = body.decode("utf-8")
      reponse.write(body)
  return stream(streaming)
@app.put("/put_stream",stream=True)
async def put_stream(request):
  async def streaming(response):
    while True:
      body = await request.stream.get()
      if body is None:
        break
      body = body.decode("utf-8")
      response.write("utf-8")
  return stream(streaming)

除了上述例子的方法之外,我们之前还讲过用add_route方法动态添加路由:

from sanic.response import text
from sanic.views import HTTPMethodView
from sanic.views import stream as stream_decorator
class StreamView(HTTPMethodView)
  @stream_decorator
  async def post(self,request)
    result = ''
    while True:
      body = await request.stream.get()
      if body is None:
        break
      body = body.decode('utf-8')
      result += body
    return text(result)
app.add_route(StreamView.as_view(),"/method_view")

值得注意的是,stream_decorator装饰器中处理函数的函数名称,若为post则为post请求,若为put则为put请求。在之前讲述路由的文章《Sanic框架路由用法》中讲到一个CompositionView类来自定义一个路由,CompositionView在流式请求中同样适用:

from sanic.views import CompositionView
async def post_stream_view(request):
  result = ''
  while True:
    body = await request.stream.get()
    if body is None:
      break
    body = body.decode('utf-8')
    result += body
  return text(result)
view = CompositionView()
view.add(['POST'],post_stream_view,stream=True)
app.add_route(view,"/post_stream_view")

响应流式传输

Sanic允许你使用stream方法将内容传输到客户端,该方法接受一个通过StreamingHTTPResponse传入的对象的协程回调,举个栗子:

from sanic.response import stream
@app.route("/post_stream_info",methods=["POST"])
async def post_stream_info(request):
  async def streaming(response):
    response.write("no")
    response.write("bug")
  return stream(streaming)

更多关于Python相关内容可查看本站专题:《Python入门与进阶经典教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python基于回溯法子集树模板实现图的遍历功能示例
Sep 05 Python
Python实现生成随机日期字符串的方法示例
Dec 25 Python
python3.x实现发送邮件功能
May 22 Python
python简单实现AES加密和解密
Mar 28 Python
Python datetime和unix时间戳之间相互转换的讲解
Apr 01 Python
python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)
Apr 01 Python
Django MEDIA的配置及用法详解
Jul 25 Python
使用Python调取任意数字资产钱包余额功能
Aug 15 Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
Oct 23 Python
如何在vscode中安装python库的方法步骤
Jan 06 Python
python中编写函数并调用的知识点总结
Jan 13 Python
Python的三个重要函数详解
Jan 18 Python
django 发送邮件和缓存的实现代码
Jul 18 #Python
python实现linux下抓包并存库功能
Jul 18 #Python
python调用tcpdump抓包过滤的方法
Jul 18 #Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
Jul 18 #Python
解决Python3中的中文字符编码的问题
Jul 18 #Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
Jul 18 #Python
python 将print输出的内容保存到txt文件中
Jul 17 #Python
You might like
新手学PHP之数据库操作详解及乱码解决!
2007/01/02 PHP
php获得url参数中具有&的值的方法
2014/03/05 PHP
ThinkPHP中的关联模型注意点
2014/06/16 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
Yii redis集合的基本使用教程
2020/06/14 PHP
从Ajax到JQuery Ajax学习
2007/02/14 Javascript
JQuery 简便实现页面元素数据验证功能
2007/03/24 Javascript
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
replace()方法查找字符使用示例
2013/10/28 Javascript
使用jquery菜单插件HoverTree仿京东无限级菜单
2014/12/18 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
jquery代码规范让代码越来越好看
2017/02/03 Javascript
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
JavaScript实现的搜索及高亮显示功能示例
2017/08/14 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
2018/08/28 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
2019/04/28 Javascript
Vue.js实现备忘录功能
2019/06/26 Javascript
js实现for循环跳过undefined值示例
2019/07/02 Javascript
微信小程序用户拒绝授权的处理方法详解
2019/09/20 Javascript
[34:39]Secret vs VG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
python实现简易内存监控
2018/06/21 Python
Flask框架web开发之零基础入门
2018/12/10 Python
Python Pexpect库的简单使用方法
2019/01/29 Python
Python日期格式和字符串格式相互转换的方法
2020/02/18 Python
计算机专业自我鉴定
2013/10/15 职场文书
新学期教师寄语
2014/04/02 职场文书
园艺师求职信
2014/04/27 职场文书
教师求职自荐书
2014/06/14 职场文书
文明单位申报材料
2014/12/23 职场文书
开会通知
2015/04/20 职场文书
因个人原因离职的辞职信范文
2015/05/12 职场文书
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
2021/04/27 Python
Golang的继承模拟实例
2021/06/30 Golang
SpringDataJPA实体类关系映射配置方式
2021/12/06 Java/Android
springboot 自定义配置 解决Boolean属性不生效
2022/03/18 Java/Android