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中合并两个文本文件并按照姓名首字母排序的例子
Apr 25 Python
Python开发实例分享bt种子爬虫程序和种子解析
May 21 Python
python中利用xml.dom模块解析xml的方法教程
May 24 Python
python导入csv文件出现SyntaxError问题分析
Dec 15 Python
Python星号*与**用法分析
Feb 02 Python
python实现内存监控系统
Mar 07 Python
python实现爬取百度图片的方法示例
Jul 06 Python
django echarts饼图数据动态加载的实例
Aug 12 Python
pandas抽取行列数据的几种方法
Dec 13 Python
python自动计算图像数据集的RGB均值
Jun 18 Python
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
Nov 11 Python
Python实现简单得递归下降Parser
May 02 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 SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
php中define用法实例
2015/07/30 PHP
Yii2分页的使用及其扩展方法详解
2016/05/23 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
Javascript 匿名函数及其代码模式原理
2010/03/19 Javascript
jQuery代码优化之基本事件
2011/11/01 Javascript
面向对象的Javascript之三(封装和信息隐藏)
2012/01/27 Javascript
JavaScript 学习笔记之操作符(续)
2015/01/14 Javascript
JavaScript实现把rgb颜色转换成16进制颜色的方法
2015/06/01 Javascript
使用Dropzone.js上传的示例代码
2017/10/10 Javascript
JS实现的简单表单验证功能完整实例
2017/10/14 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
Echarts.js无法引入问题解决方案
2020/10/30 Javascript
在nodejs中创建child process的方法
2021/01/26 NodeJs
Python常见数据结构详解
2014/07/24 Python
全面理解Python中self的用法
2016/06/04 Python
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
Python3 加密(hashlib和hmac)模块的实现
2017/11/23 Python
python判断列表的连续数字范围并分块的方法
2018/11/16 Python
使用python对文件中的单词进行提取的方法示例
2018/12/21 Python
Python3实现二叉树的最大深度
2019/09/30 Python
numpy.array 操作使用简单总结
2019/11/08 Python
基于python实现语音录入识别代码实例
2020/01/17 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
Keras实现将两个模型连接到一起
2020/05/23 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
2020/05/26 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
2020/06/03 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
2020/09/21 Python
船餐厅和泰晤士河餐饮游轮:Bateaux London
2018/03/19 全球购物
丝芙兰新加坡官网:Sephora新加坡
2018/12/04 全球购物
高一英语教学反思
2014/01/22 职场文书
司机岗位职责范本
2015/04/10 职场文书
读《儒林外史》有感:少一些功利,多一些真诚
2020/01/19 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS
用python画城市轮播地图
2021/05/28 Python
php png失真的原因及解决办法
2021/11/17 PHP