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中使用OpenCV库来进行简单的气象学遥感影像计算
Feb 19 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
Feb 24 Python
DataFrame中的object转换成float的方法
Apr 10 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
Nov 07 Python
Django web框架使用url path name详解
Apr 29 Python
通过pycharm使用git的步骤(图文详解)
Jun 13 Python
python按键按住不放持续响应的实例代码
Jul 17 Python
Python使用微信接入图灵机器人过程解析
Nov 04 Python
利用python爬取有道词典的方法
Dec 08 Python
python 制作一个gui界面的翻译工具
May 14 Python
使用Python解决图表与画布的间距问题
Apr 11 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
2020年4月放送决定!第2期TV动画《邪神酱飞踢》视觉图&主题曲情报公开!
2020/03/06 日漫
PHP Ajax中文乱码问题解决方法
2009/02/27 PHP
DEDECMS首页调用图片集里的多张图片
2015/06/05 PHP
php获取网站百度快照日期的方法
2015/07/29 PHP
PHP大文件分片上传的实现方法
2018/10/28 PHP
无语,javascript居然支持中文(unicode)编程!
2007/04/12 Javascript
JScript 脚本实现文件下载 一般用于下载木马
2009/10/29 Javascript
js简易namespace管理器 实例代码
2013/06/21 Javascript
JS操作iframe里的dom(实例讲解)
2014/01/29 Javascript
教你如何使用firebug调试功能了解javascript闭包和this
2015/03/04 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
2015/08/27 Javascript
JavaScript多并发问题如何处理
2015/10/28 Javascript
jQuery formValidator表单验证
2016/01/07 Javascript
jQuery访问浏览器本地存储cookie、localStorage和sessionStorage的基本用法
2017/10/20 jQuery
Vue插值、表达式、分隔符、指令知识小结
2018/10/12 Javascript
vue-cli3 项目从搭建优化到docker部署的方法
2019/01/28 Javascript
Vue开发之封装上传文件组件与用法示例
2019/04/25 Javascript
解决vue项目中页面调用数据 在数据加载完毕之前出现undefined问题
2019/11/14 Javascript
Js视频播放器插件Video.js使用方法详解
2020/02/04 Javascript
vue3.0 的 Composition API 的使用示例
2020/10/26 Javascript
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
python下解压缩zip文件并删除文件的实例
2018/04/24 Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
2020/03/31 Python
Python 列表推导式需要注意的地方
2020/10/23 Python
5个你不知道的HTML5的接口介绍
2013/08/07 HTML / CSS
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
高校毕业生登记表自我鉴定
2013/11/03 职场文书
质量管理标语
2014/06/12 职场文书
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
井冈山红色之旅感想
2014/10/07 职场文书
就业意向协议书
2015/01/29 职场文书
员工自我工作评价
2015/03/06 职场文书
大学生村官入党自传
2015/06/26 职场文书
Feign调用传输文件异常的解决
2021/06/24 Java/Android
Win11右下角图标点了没反应怎么办?Win11点击右下角图标无反应解决方法汇总
2022/07/07 数码科技
mysql sock文件存储了什么信息
2022/07/15 MySQL