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和OpenCV库将URL转换为OpenCV格式的方法
Mar 27 Python
python使用多线程不断刷新网页的方法
Mar 31 Python
详细解析Python中的变量的数据类型
May 13 Python
django限制匿名用户访问及重定向的方法实例
Feb 07 Python
pandas通过loc生成新的列方法
Nov 28 Python
对django xadmin自定义菜单的实例详解
Jan 03 Python
Python2与Python3的区别点整理
Dec 12 Python
python多进程重复加载的解决方式
Dec 13 Python
Python原始套接字编程实例解析
Jan 29 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
Feb 28 Python
Tensorflow之梯度裁剪的实现示例
Mar 08 Python
python实现斗地主分牌洗牌
Jun 22 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 设计模式之观察者模式介绍
2012/02/22 PHP
ThinkPHP3.1新特性之G方法的使用
2014/06/19 PHP
PHP图片添加水印功能示例小结
2016/10/03 PHP
php cookie 详解使用实例
2016/11/03 PHP
jQuery 学习第五课 Ajax 使用说明
2010/05/17 Javascript
javascript 折半查找字符在数组中的位置(有序列表)
2010/12/09 Javascript
基于JQuery实现CheckBox全选全不选
2011/06/27 Javascript
js 弹出菜单/窗口效果
2011/10/30 Javascript
js实现目录定位正文示例
2013/11/14 Javascript
用JavaScript实现页面重定向功能的教程
2015/06/04 Javascript
jQuery实现右下角可缩放大小的层完整实例
2016/06/20 Javascript
Angularjs验证用户输入的字符串是否为日期时间
2017/06/01 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
2017/06/20 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
Node.js事件的正确使用方法
2019/04/05 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
JS获取表格视图所选行号的ids过程解析
2020/02/21 Javascript
解决Echarts2竖直datazoom滑动后显示数据不全的问题
2020/07/20 Javascript
vue style width a href动态拼接问题的解决
2020/08/07 Javascript
[01:39:42]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python获取当前路径实现代码
2017/05/08 Python
在pycharm中使用git版本管理以及同步github的方法
2019/01/16 Python
浅谈pytorch中的BN层的注意事项
2020/06/23 Python
Python如何实现自带HTTP文件传输服务
2020/07/08 Python
python代码实现猜拳小游戏
2020/11/30 Python
纯css3(无图片/js)制作的几个社交媒体网站的图标
2013/03/21 HTML / CSS
新西兰领先的鞋类和靴子网上商城:Merchant 1948
2017/09/08 全球购物
Book Depository亚太地区:一家领先的国际图书零售商
2019/05/05 全球购物
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
2012/06/05 面试题
学校安全工作制度
2014/01/19 职场文书
微观物理专业自荐信
2014/01/26 职场文书
优秀民警事迹材料
2014/01/29 职场文书
党员自我评价2015
2015/03/03 职场文书
初中开学典礼新闻稿
2015/07/17 职场文书