Sanic框架请求与响应实例分析


Posted in Python onJuly 16, 2018

本文实例讲述了Sanic框架请求与响应。分享给大家供大家参考,具体如下:

前面介绍了Sanic框架的路由,这里接着介绍Sanic框架的请求与响应。

简介

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

前言Sanic最低支持Python 3.5,如果需要学习Sanic,请先下载版本不低于3.5的Python包

请求数据

当一个端点收到一个HTTP请求时,路由功能被传递到一个request对象。以下变量可以作为request对象的属性访问:

  • json:JSON数据
@app.route("/post_data",methods=["POST"])
async def post_data(request):
  # 将打印传递过来的JSON数据
  print(request.json)
  return text("it is ok!")
  • args:查询字符串变量。查询字符串是类似于URL的部分?name=laozhang&age=20。如果URL被解析,那么args字典将如下所示:{"name":["laozhang"],"age":[20]}
  • raw_args:在许多情况下,我们需要获取压缩程度低的字典中的url参数。对于之前的URL?name=laozhang&age=20raw_args字典将如下所示:{"name":"laozhang","age":20}
  • file:文件对象字典,具有名称,正文和类型的文件列表
@app.route("/post_file_data",methods=["POST"])
async def post_file_data(request):
  info = request.files.get("file")
  print(info.name)
  print(info.type)
  print(info.body)
  return text("it is ok!")
  • form:表单数据,form字典将如下所示:{"name":["laozhang"]}
@app.route("/post_form_data",methods=["POST"])
async def post_form_data(request):
  name = request.form.get("name")
  return text("it is ok!")
  • body:原始数据。无论内容类型如何,该属性都允许检索请求的原始数据。byte类型
  • headers:获取请求表头的不区分大小写的字典。dict类型
  • ip:IP地址,str类型
  • port:端口,str类型
  • socket:请求者的IP地址和端口,(IP地址,端口)。tuple类型
  • app:对处理请求的Sanic应用程序对象的引用。
@appr.route("/get_app_info")
async def get_app_info(request):
  print(request.app.config)
  return text("it is ok!")
  • url:请求的完整URL,如:http://localhost:5000/get_app_info
  • scheme:获取与请求关联的URL方案:httphttps
  • host:获取与请求关联的主机
  • path:获取请求的路径,如:/get_app_info
  • query_string:获取查询的字符串,如:name=zhangsan或者为一个空白字符串
  • uri_template:获取匹配路由处理程序的模板,如:/get/<id>
  • token:授权标头的值

get与getlist

当我们访问一个GET请求,并传入相关参数时,如下的请求:

@app.route("/get_info")
async def get_info(request):
  print(request.args.get("name"))
  print(request.args.getlist("name")
  return text("it is ok!")

当我们传入一个namelaozhang时,在上面有提到,args字典将会是{"name":["laozhang"],所以,访问上面的路由,将会打印如下结果:

laozhang
["laozhang"]

响应

使用sanic.response模块中的函数来创建响应

纯文本:

from sanic.response import text
@app.route("/text")
async def get_text(request):
  return text("it is text response!")

HTML:

from sanic.response import html
@app.route("/html")
async def get_html(request):
  return html("<p>it is html!</p>")

JSON:

from sanic.response import json
@app.route("/json")
async def get_json(request):
  return json({"name":"laozhang"})

FILE:

from sanic.response import file
@app.route("/file")
async def get_file(request):
  return await file("/xx/aa/abc.png")

切记,不能少了await关键字

STREAM:

from sanic.response import stream
@app.route("/stream")
async def get_stream(request):
  async def stream_fn(response):
    response.write("abc")
    response.write("def")
  return stream(stream_fn,content_type="text/plain")

文件流:针对大文件,上面文件与流的组合

from sanic.response import file_stream
@app.route("/file_stream")
async def get_file_stream(request):
  return await file_stream("/xx/aa/abc.png")

切记,不能少了await关键字

重定向:

from sanic.response import redirect
@app.route("/redirect")
async def get_redirect(request):
  return redirect("/json")

RAW:未编码的body响应

from sanic.response import raw
@app.route("/raw")
async def get_raw(request):
  return raw(b"it is raw data")

访问此接口后,将会立即下载一个名为raw的文件,里面包含内容it is raw data

修改请求头和状态值:如果需要修改请求头和状态值,请将headersstatus参数传递给上面这些函数,下面以json为例

from sanic.response import json
@app.route("/json")
async def get_json(request):
  return json({"name":"老张"},headers={"age":18},status=403)

访问此接口后,会发现原来本应是200的状态值变成了403,而且请求头信息中增加了{"age":18}

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

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

Python 相关文章推荐
用Python的Tornado框架结合memcached页面改善博客性能
Apr 24 Python
python中numpy.zeros(np.zeros)的使用方法
Nov 07 Python
python批量替换页眉页脚实例代码
Jan 22 Python
python自动发邮件库yagmail的示例代码
Feb 23 Python
TensorFlow的权值更新方法
Jun 14 Python
将tensorflow的ckpt模型存储为npy的实例
Jul 09 Python
在pandas多重索引multiIndex中选定指定索引的行方法
Nov 16 Python
Python tkinter三种布局实例详解
Jan 06 Python
python简单的三元一次方程求解实例
Apr 02 Python
使用keras实现孪生网络中的权值共享教程
Jun 11 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
Jun 24 Python
Pytorch mask-rcnn 实现细节分享
Jun 24 Python
解决Python 中英文混输格式对齐的问题
Jul 16 #Python
Django实战之用户认证(用户登录与注销)
Jul 16 #Python
Python3数据库操作包pymysql的操作方法
Jul 16 #Python
django缓存配置的几种方法详解
Jul 16 #Python
Python 字符串与数字输出方法
Jul 16 #Python
Django实战之用户认证(初始配置)
Jul 16 #Python
python format 格式化输出方法
Jul 16 #Python
You might like
一个php作的文本留言本的例子(三)
2006/10/09 PHP
《PHP编程最快明白》第三讲:php数组
2010/11/01 PHP
php Session存储到Redis的方法
2013/11/04 PHP
浅析php数据类型转换
2014/01/09 PHP
ThinkPHP实现跨模块调用操作方法概述
2014/06/20 PHP
9个比较实用的php代码片段
2016/03/15 PHP
使弱类型的语言JavaScript变强势
2009/06/22 Javascript
通过js来制作复选框的全选和不选效果
2014/05/22 Javascript
我的Node.js学习之路(二)NPM模块管理
2014/07/06 Javascript
基于JS实现网页中的选项卡(两种方法)
2017/06/16 Javascript
VueJs组件prop验证简单介绍
2017/09/12 Javascript
动态统计当前输入内容的字节、字符数的实例详解
2017/10/27 Javascript
jQuery实现的简单获取索引功能示例
2018/06/04 jQuery
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
使用FormData实现上传多个文件
2018/12/04 Javascript
nodejs搭建本地服务器并访问文件操作示例
2019/05/11 NodeJs
微信小程序swiper使用网络图片不显示问题解决
2019/12/13 Javascript
Python for Informatics 第11章之正则表达式(二)
2016/04/21 Python
使用Python进行二进制文件读写的简单方法(推荐)
2016/09/12 Python
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
Django框架使用mysql视图操作示例
2019/05/15 Python
python 使用plt画图,去除图片四周的白边方法
2019/07/09 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
python3 写一个WAV音频文件播放器的代码
2019/09/27 Python
python 解压、复制、删除 文件的实例代码
2020/02/26 Python
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
美国祛痘、抗衰老药妆品牌:Murad
2016/08/27 全球购物
奥斯汀独木舟和皮划艇:Austin Canoe & Kayak
2018/05/22 全球购物
英国最大的独立玩具专卖店:The Entertainer
2019/09/06 全球购物
幼儿园老师寄语
2014/04/03 职场文书
校园文明倡议书
2014/05/16 职场文书
小学生环保标语
2014/06/13 职场文书
图书室标语
2014/06/21 职场文书
先进事迹演讲稿
2014/09/01 职场文书
介绍信范文
2015/01/31 职场文书
2015年食品安全宣传周活动总结
2015/07/09 职场文书