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中的对象,方法,类,实例,函数用法分析
Jan 15 Python
Python中使用pprint函数进行格式化输出的教程
Apr 07 Python
python dict 字典 以及 赋值 引用的一些实例(详解)
Jan 20 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
Jul 11 Python
用Python一键搭建Http服务器的方法
Jun 01 Python
使用Python获取网段IP个数以及地址清单的方法
Nov 01 Python
Python定时任务APScheduler的实例实例详解
Jul 22 Python
在Python中os.fork()产生子进程的例子
Aug 08 Python
python实现简单井字棋游戏
Mar 04 Python
4行Python代码生成图像验证码(2种)
Apr 07 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
Jun 23 Python
Python类成员继承重写的实现
Sep 16 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使用百度翻译api示例分享
2014/01/31 PHP
PHP生成不重复随机数的方法汇总
2014/11/19 PHP
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
php技巧小结【推荐】
2017/01/19 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
Laravel 创建指定表 migrate的例子
2019/10/09 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
2020/04/27 PHP
javascript中最常用的继承模式 组合继承
2010/08/12 Javascript
构造函数+原型模式构造js自定义对象(最通用)
2014/05/12 Javascript
JavaScript实现简单图片翻转的方法
2015/04/17 Javascript
jQuery实现的Div窗口震动效果实例
2015/08/07 Javascript
Node.js巧妙实现Web应用代码热更新
2015/10/22 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
2016/05/07 Javascript
noty ? jQuery通知插件全面解析
2016/05/18 Javascript
jQuery根据表单name获取值的方法
2016/05/24 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
原生js实现对Ajax的封装(仿jquery)
2017/01/22 Javascript
vue2.0中vue-cli实现全选、单选计算总价格的实例代码
2017/07/18 Javascript
原生JS实现的碰撞检测功能示例
2018/05/18 Javascript
vue中slot(插槽)的介绍与使用
2018/11/12 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
2018/12/09 Javascript
微信小程序实现拍照画布指定区域生成图片
2019/07/18 Javascript
Node.js使用MongoDB的ObjectId作为查询条件的方法
2019/09/10 Javascript
详解利用nodejs对本地json文件进行增删改查
2019/09/20 NodeJs
vue项目中js-cookie的使用存储token操作
2020/11/13 Javascript
python中的__slots__使用示例
2015/02/26 Python
使用Python中PDB模块中的命令来调试Python代码的教程
2015/03/30 Python
Python获取央视节目单的实现代码
2015/07/25 Python
关于Python中空格字符串处理的技巧总结
2017/08/10 Python
基于Django模板中的数字自增(详解)
2017/09/05 Python
解读! Python在人工智能中的作用
2017/11/14 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
2018/12/05 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
2020/01/04 Python
PyQt5通过信号实现MVC的示例
2021/02/06 Python
YSL圣罗兰美妆官方旗舰店:购买YSL口红
2018/04/16 全球购物
如何书写民事调解协议书?
2019/06/25 职场文书