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实现RSA加密(解密)算法
Feb 17 Python
Python编程实现蚁群算法详解
Nov 13 Python
Django框架实现的简单分页功能示例
Dec 04 Python
Python datetime和unix时间戳之间相互转换的讲解
Apr 01 Python
对Python获取屏幕截图的4种方法详解
Aug 27 Python
NumPy中的维度Axis详解
Nov 26 Python
python要安装在哪个盘
Jun 15 Python
python speech模块的使用方法
Sep 09 Python
python进行二次方程式计算的实例讲解
Dec 06 Python
pycharm 的Structure界面设置操作
Feb 05 Python
python爬虫今日热榜数据到txt文件的源码
Feb 23 Python
教你怎么用python selenium实现自动化测试
May 27 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/03/11 PHP
PHP setcookie指定domain参数后,在IE下设置cookie失效的解决方法
2011/09/09 PHP
PHP实现变色验证码实例
2014/01/06 PHP
thinkPHP5.0框架命名空间详解
2017/03/18 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
2007/03/10 Javascript
基于Jquery的文字滚动跑马灯插件(一个页面多个滚动区)
2010/07/26 Javascript
jquery下异步提交表单 异步跨域提交表单
2010/11/17 Javascript
JS传值出现中文参数乱码的解决方法
2016/06/30 Javascript
购物车前端开发(jQuery和bootstrap3)
2016/08/27 Javascript
javascript replace()第二个参数为函数时的参数用法
2016/12/26 Javascript
微信小程序 设置启动页面的两种方法
2017/03/09 Javascript
详解nodejs微信公众号开发——1.接入微信公众号
2017/04/10 NodeJs
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
layui使用表格渲染获取行数据的例子
2019/09/13 Javascript
JavaScript利用键盘码控制div移动
2020/03/19 Javascript
javascript实现文字跑马灯效果
2020/06/18 Javascript
[02:29]大剑、皮鞭、女装,这届DOTA2勇士令状里都有
2020/07/17 DOTA
实例讲解Python中global语句下全局变量的值的修改
2016/06/16 Python
Python算术运算符实例详解
2017/05/31 Python
关于python的list相关知识(推荐)
2017/08/30 Python
在Python中分别打印列表中的每一个元素方法
2018/11/07 Python
python爬取Ajax动态加载网页过程解析
2019/09/05 Python
利用Python校准本地时间的方法教程
2019/10/31 Python
浅谈python锁与死锁问题
2020/08/14 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
2014/12/30 面试题
普通院校学生的自荐信
2013/11/27 职场文书
网上开商店的创业计划书
2014/01/19 职场文书
幼儿园教师国培感言
2014/02/02 职场文书
迟到检讨书300字
2014/02/14 职场文书
祖国在我心中演讲稿500字
2014/05/04 职场文书
房地产开发项目建议书
2014/05/16 职场文书
同学聚会策划方案
2014/06/06 职场文书
无财产无子女离婚协议书范文
2014/09/14 职场文书
《揠苗助长》教学反思
2016/02/20 职场文书
Nginx 负载均衡是什么以及该如何配置
2021/03/31 Servers