Python对Tornado请求与响应的数据处理


Posted in Python onFebruary 12, 2020

获取查询字符串参数

get_query_argument(name, default=_ARG_DEFAULT, strip=True)

从请求的查询字符串中返回指定参数name的值,如果出现多个同名参数,则返回最后一个的值;

default为路由中未传name参数时返回的默认值,如default未设置,则会抛出tornado.web.MissingArgumentError异常;

strip表示是否过滤掉左右两边的空白字符,默认为过滤。

get_query_arguments(name, strip=True)

从请求的查询字符串中返回指定参数name的值,注意返回的是list列表(即使对应name参数只有一个值),若未找到name参数,则返回空列表。

获取请求体数据

get_body_argument(name, default=_ARG_DEFAULT, strip=True)

从请求体中返回指定参数name的值,如出现多个同名参数,则返回最后一个的值;

default与strip同上。

get_body_arguments(name, strip=True)

从请求体中返回指定参数name的值,注意返回的是list列表(即使对应name参数只有一个值),若未找到name参数,则返回空列表。

说明:对于请求体中数据为json或xml的,无法通过这两个方法获取。

前两类方法的整合

get_argument(name, default=_ARG_DEFAULT, strip=True)

get_arguments(name, strip=True)

说明:对于请求体中数据为json或xml的,无法通过这两个方法获取。

这两个方法最常用

获取请求体中的json或xml数据

body_json = self.request.body

body_dict = json.loads(body_json)

需要先判断请求体的数据是否为 application/json 格式:

if self.reuqest.headers.get("Content-Type", "").startswith("application/json"):
try:
  # 防止请求头内容是application/json,实际内容不是json数据
  body_dict = json.loads(self.request.body)
except Exception as e:
  logger({"message": e})
    body_dict = dict()

正则提取uri中的参数

第一种是未命名的方式,按照匹配顺序进行传递:

...
def get(self, subject, city):
 
...
(r"/subject/(.+)/(.+)", SubjectCityHandler),
...

第二种是以命名的方式进行传递:

...
def get(self, city, date):
 
...
(r"/subject/(?P<date>.+)/(?P<city>.+)", SubjectCityHandler),
...

Tornado的Request对象属性

属性 说明
self.request.method  http的请求头;get, post等
self.reuqest.uri  客户端请求完整的uri
self.request.path  uri的路径名,不包含查询的字符串
self.request.query uri中的查询字符串
self.request.version http/1.1
self.request.headers 请求头
self.requset.body 字符串的消息
self.request.remote_ip 客户端请求的ip
self.request.protocol http的协议http or https
self.request.host 请求消息的主机名
self.request.files 以字典的方式表达客户端上传的文件
self.request.cookies 客户端的cookies字典
self.request.arguments  客户端提交的参数
import tornado.web
import tornado.ioloop
import tornado.httpserver
import tornado.options # 新导入的options模块
 
tornado.options.define("port", default=8000, type=int, help="服务器监听端口号")
tornado.options.define("content", default=[], type=str, multiple=True, help="控制台输出内容")
 
class IndexHandler(tornado.web.RequestHandler):
  """主路由处理类"""
  def get(self):
    self.write("Hello World!")
    self.write("\n-------method:\n")
    self.write(self.request.method)
    self.write("\n-------uri:\n")
    self.write(self.request.uri)
    self.write("\n-------path:\n")
    self.write(self.request.path)
    self.write("\n-------query:\n")
    self.write(self.request.query)
    self.write("\n-------version:\n")
    self.write(self.request.version)
    self.write("\n-------headers['Accept-Language']:\n")
    self.write(self.request.headers["Accept-Language"])
    self.write("\n-------body:\n")
    self.write(self.request.body)
    self.write("\n-------remote_ip:\n")
    self.write(self.request.remote_ip)
    self.write("\n-------protocol:\n")
    self.write(self.request.protocol)
    self.write("\n-------host:\n")
    self.write(self.request.host)
    self.write("\n-------arguments:\n")
    self.write(self.request.arguments)
    self.write("\n-------query_arguments:\n")
    self.write(self.request.query_arguments)
    self.write("\n-------body_arguments:\n")
    self.write(self.request.body_arguments)
    self.write("\n-------files:\n")
    self.write(self.request.files)
    self.write("\n-------cookies:\n")
    self.write(self.request.cookies)
    self.write("\n")
 
  #自定义settings
settings = {
  "template_path":"templates",
  "static_path":"statics",
}
 
if __name__ == "__main__":
  tornado.options.parse_config_file("./config")
  print(tornado.options.options.content) # 控制台输出内容
 
  app = tornado.web.Application([
    (r"/", IndexHandler),
  ],debug=True,**settings)
 
  http_server = tornado.httpserver.HTTPServer(app)
  http_server.listen(tornado.options.options.port)

更多关于Python对Tornado请求与响应的数据处理方法请查看下面的相关链接

Python 相关文章推荐
深入Python解释器理解Python中的字节码
Apr 01 Python
Python的Django框架使用入门指引
Apr 15 Python
python抓取网页中图片并保存到本地
Dec 01 Python
Python 读写文件和file对象的方法(推荐)
Sep 12 Python
json跨域调用python的方法详解
Jan 11 Python
python使用两种发邮件的方式smtp和outlook示例
Jun 02 Python
python 多个参数不为空校验方法
Feb 14 Python
Python实战购物车项目的实现参考
Feb 20 Python
python内存监控工具memory_profiler和guppy的用法详解
Jul 29 Python
python+opencv3生成一个自定义纯色图教程
Feb 19 Python
解决python 执行shell命令无法获取返回值的问题
Dec 05 Python
python中复数的共轭复数知识点总结
Dec 06 Python
在PyCharm中实现添加快捷模块
Feb 12 #Python
Python的赋值、深拷贝与浅拷贝的区别详解
Feb 12 #Python
解决pyCharm中 module 调用失败的问题
Feb 12 #Python
Python写出新冠状病毒确诊人数地图的方法
Feb 12 #Python
pycharm通过ssh连接远程服务器教程
Feb 12 #Python
python日期与时间戳的各种转换示例
Feb 12 #Python
Python使用uuid库生成唯一标识ID
Feb 12 #Python
You might like
一步一步学习PHP(8) php 数组
2010/03/05 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
2014/07/24 PHP
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
PHP 进度条函数的简单实例
2017/09/19 PHP
支持ie与FireFox的剪切板操作代码
2009/09/28 Javascript
屏蔽F1~F12的快捷键的js函数
2010/05/06 Javascript
Javascript 垃圾收集机制介绍理解
2013/05/14 Javascript
node.js使用nodemailer发送邮件实例
2014/03/10 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
轻松理解JavaScript闭包
2017/03/14 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
2017/08/02 Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
2017/08/14 Javascript
原生JS上传大文件显示进度条 php上传文件代码
2020/03/27 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
2019/03/12 Javascript
Vue CL3 配置路径别名详解
2019/05/30 Javascript
浅谈layer弹出层按钮颜色修改方法
2019/09/11 Javascript
vue实现信息管理系统
2020/05/30 Javascript
微信小程序中data-key属性之数据传输(经验总结)
2020/08/22 Javascript
vue实现动态表格提交参数动态生成控件的操作
2020/11/09 Javascript
[01:33:14]LGD vs VP Supermajor 败者组决赛 BO3 第二场 6.10
2018/07/04 DOTA
[46:44]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第二场 3月7日
2021/03/11 DOTA
让python json encode datetime类型
2010/12/28 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
如何快速一次性卸载所有python包(第三方库)呢
2020/10/20 Python
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
优秀技术工人先进材料
2014/02/17 职场文书
旅游与酒店管理专业求职信
2014/07/21 职场文书
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
2014年教务工作总结
2014/12/03 职场文书
公务员个人年终总结
2015/02/12 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
2016小学教师读书心得体会
2016/01/13 职场文书
win10电脑双屏显示一个黑屏怎么办?win10电脑双屏显示一个黑屏解决方法
2022/07/15 数码科技