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实现的简单dns查询功能示例
May 24 Python
python实现批量按比例缩放图片效果
Mar 30 Python
python解决js文件utf-8编码乱码问题(推荐)
May 02 Python
深入分析python中整型不会溢出问题
Jun 18 Python
详解多线程Django程序耗尽数据库连接的问题
Oct 08 Python
python文件写入write()的操作
May 14 Python
python实现京东订单推送到测试环境,提供便利操作示例
Aug 09 Python
Python实现变声器功能(萝莉音御姐音)
Dec 05 Python
如何查看Django ORM执行的SQL语句的实现
Apr 20 Python
快速了解Python开发环境Spyder
Jun 29 Python
Python pymysql模块安装并操作过程解析
Oct 13 Python
python爬虫scrapy图书分类实例讲解
Nov 23 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读取flash文件高宽帧数背景颜色的方法
2015/01/06 PHP
php编写的一个E-mail验证类
2015/03/25 PHP
PHP数组相加操作及与array_merge的区别浅析
2016/11/26 PHP
javascript中动态加载js文件多种解决办法总结
2013/11/15 Javascript
基于javascript实现句子翻牌网页版小游戏
2016/03/23 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
利用Angularjs实现幻灯片效果
2016/09/07 Javascript
js滚轮事件兼容性问题需要注意哪些
2016/11/15 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
详解使用angularjs的ng-options时如何设置默认值(初始值)
2017/07/18 Javascript
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
深入理解requireJS-实现一个简单的模块加载器
2018/01/15 Javascript
几个你不知道的技巧助你写出更优雅的vue.js代码
2018/06/11 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
2018/07/25 Javascript
Vue.js获取被选择的option的value和text值方法
2018/08/24 Javascript
CSS3 动画卡顿性能优化的完美解决方案
2018/09/20 Javascript
vue-router的hooks用法详解
2020/06/08 Javascript
vue添加自定义右键菜单的完整实例
2020/12/08 Vue.js
Python实现Youku视频批量下载功能
2017/03/14 Python
利用django如何解析用户上传的excel文件
2017/07/24 Python
Django使用详解:ORM 的反向查找(related_name)
2018/05/30 Python
python按照多个条件排序的方法
2019/02/08 Python
Python绘制频率分布直方图的示例
2019/07/08 Python
浅析PyTorch中nn.Linear的使用
2019/08/18 Python
python 并发编程 多路复用IO模型详解
2019/08/20 Python
Python爬虫开发与项目实战
2020/12/16 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
2021/01/07 Python
pycharm 使用anaconda为默认环境的操作
2021/02/05 Python
python爬虫破解字体加密案例详解
2021/03/02 Python
应聘教师推荐信
2013/10/31 职场文书
幼儿园大班新学期寄语
2014/01/18 职场文书
剪彩仪式主持词
2014/03/19 职场文书
敬老院活动感想
2015/08/07 职场文书
tensorflow学习笔记之tfrecord文件的生成与读取
2021/03/31 Python
ubuntu安装jupyter并设置远程访问的实现
2022/03/31 Python
解决IDEA翻译插件Translation报错更新TTK失败不能使用
2022/04/24 Python