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之入门(二)基本数据类型
May 25 Python
Collatz 序列、逗号代码、字符图网格实例
Jun 22 Python
python+matplotlib绘制3D条形图实例代码
Jan 17 Python
python模拟登陆,用session维持回话的实例
Dec 27 Python
解决python Markdown模块乱码的问题
Feb 14 Python
Python使用sklearn库实现的各种分类算法简单应用小结
Jul 04 Python
用Python实现将一张图片分成9宫格的示例
Jul 05 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
Aug 13 Python
Django项目中使用JWT的实现代码
Nov 04 Python
Pandas读取csv时如何设置列名
Jun 02 Python
Python 日期与时间转换的方法
Aug 01 Python
零基础学python应该从哪里入手
Aug 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
PHP+ajax分页实例简析
2015/12/07 PHP
php的socket编程详解
2016/11/20 PHP
javascript 进度条 实现代码
2009/07/30 Javascript
jquery链式操作的正确使用方法
2014/01/06 Javascript
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
2014/09/01 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
JS实现可直接显示网页代码运行效果的HTML代码预览功能实例
2015/08/06 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
2015/09/24 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
2016/09/28 Javascript
JS基于递归实现倒计时效果的方法
2016/11/26 Javascript
Bootstrap 模态框实例插件案例分析
2016/12/28 Javascript
javascript深拷贝和浅拷贝详解
2017/02/14 Javascript
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
浅谈Vue SPA 首屏加载优化实践
2017/12/15 Javascript
JavaScript寄生组合式继承实例详解
2018/01/06 Javascript
Next.js实现react服务器端渲染的方法示例
2019/01/06 Javascript
微信小程序实现一个简单swiper代码实例
2019/12/30 Javascript
D3.js 实现带伸缩时间轴拓扑图的示例代码
2020/01/20 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
2020/05/12 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
PHP读取远程txt文档到数组并实现遍历
2020/08/25 Javascript
python实现划词翻译
2020/04/23 Python
Python使用QQ邮箱发送Email的方法实例
2017/02/09 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
python实现维吉尼亚加密法
2019/03/20 Python
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
python 生成正态分布数据,并绘图和解析
2020/12/21 Python
Manuka Doctor美国官网:麦卢卡蜂蜜和蜂毒护肤
2016/12/25 全球购物
波兰家居和花园家具专家:4Home
2019/05/26 全球购物
大学生自我鉴定
2013/12/08 职场文书
迷你西餐厅创业计划书范文
2013/12/31 职场文书
自行车广告词大全
2014/03/21 职场文书
会计人员演讲稿
2014/09/11 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
css中有哪些方式可以隐藏页面元素及区别
2022/06/16 HTML / CSS