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使用cookie库操保存cookie详解
Mar 03 Python
python如何实现excel数据添加到mongodb
Jul 30 Python
python开发之str.format()用法实例分析
Feb 22 Python
Django查询数据库的性能优化示例代码
Sep 24 Python
使用pandas对矢量化数据进行替换处理的方法
Apr 11 Python
python抓取搜狗微信公众号文章
Apr 01 Python
Python 日期区间处理 (本周本月上周上月...)
Aug 08 Python
代码总结Python2 和 Python3 字符串的区别
Jan 28 Python
TensorFlow实现指数衰减学习率的方法
Feb 05 Python
Python使用configparser读取ini配置文件
May 25 Python
Python使用xlrd实现读取合并单元格
Jul 09 Python
PyCharm Ctrl+Shift+F 失灵的简单有效解决操作
Jan 15 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 daddslashes 使用方法介绍
2012/10/26 PHP
php中smarty区域循环的方法
2015/06/11 PHP
php实现比较两个文件夹异同的方法
2015/06/18 PHP
php输出文字乱码的解决方法
2019/10/04 PHP
网页自动刷新,不产生嗒嗒声的一个解决方法
2007/03/27 Javascript
javascript encodeURI和encodeURIComponent的比较
2010/04/03 Javascript
javascript代码加载优化方法
2011/01/30 Javascript
javascript数组快速打乱重排的方法
2014/01/02 Javascript
button没写type=button会导致点击时提交
2014/03/06 Javascript
动态载入js提高网页打开速度的方法
2014/07/04 Javascript
js库Modernizr的介绍和使用
2015/05/07 Javascript
javascript基础语法学习笔记
2016/01/04 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
jQuery实现表格文本框淡入更改值后淡出效果
2016/09/27 Javascript
vue.js删除列表中的一行
2018/06/30 Javascript
vue.js通过路由实现经典的三栏布局实例代码
2018/07/08 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
2018/07/24 jQuery
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
vue项目前端微信JSAPI与外部H5支付相关实现过程及常见问题
2020/04/14 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
python传递参数方式小结
2015/04/17 Python
Python 实现选择排序的算法步骤
2018/04/22 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
Python实现TCP通信的示例代码
2019/09/09 Python
大家都说好用的Python命令行库click的使用
2019/11/07 Python
Python yield生成器和return对比代码实例
2020/04/20 Python
Python操作Excel把数据分给sheet
2020/05/20 Python
办公室主任职责范文
2013/11/08 职场文书
劳资员岗位职责
2013/11/11 职场文书
党员自我评价分享
2013/12/13 职场文书
观看《周恩来的四个昼夜》思想汇报
2014/09/12 职场文书
学校群众路线专项整治方案
2014/10/31 职场文书
2015小学新教师个人工作总结
2015/10/14 职场文书
python获取字符串中的email
2022/03/31 Python
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
2022/04/20 MySQL
MySQL性能指标TPS+QPS+IOPS压测
2022/08/05 MySQL