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 相关文章推荐
探索Python3.4中新引入的asyncio模块
Apr 08 Python
python使用mailbox打印电子邮件的方法
Apr 30 Python
Python2中的raw_input() 与 input()
Jun 12 Python
Python基于pygame实现图片代替鼠标移动效果
Nov 11 Python
python学习之面向对象【入门初级篇】
Jan 21 Python
使用Python对Excel进行读写操作
Mar 30 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
Apr 21 Python
python实现事件驱动
Nov 21 Python
python3实现高效的端口扫描
Aug 31 Python
python3 re返回形式总结
Nov 20 Python
pytorch交叉熵损失函数的weight参数的使用
May 24 Python
Python中itertools库的四个函数介绍
Apr 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
神族 Protoss 剧情介绍
2020/03/14 星际争霸
spl_autoload_register与autoload的区别详解
2013/06/03 PHP
php截取中文字符串不乱码的方法
2013/12/25 PHP
php实现RSA加密类实例
2015/03/26 PHP
从wamp到xampp的升级之路
2015/04/08 PHP
PHP类的封装与继承详解
2015/09/29 PHP
php 根据自增id创建唯一编号类
2017/04/06 PHP
js 获取计算后的样式写法及注意事项
2013/02/25 Javascript
Document.location.href和.replace的区别示例介绍
2014/03/04 Javascript
小结Node.js中非阻塞IO和事件循环
2014/09/18 Javascript
js判断某个方法是否存在实例代码
2015/01/10 Javascript
javaScript基础语法介绍
2015/02/28 Javascript
JQuery实现动态添加删除评论的方法
2015/05/18 Javascript
js对象浅拷贝和深拷贝详解
2016/09/05 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
2017/02/08 Javascript
bootstrap实现的自适应页面简单应用示例
2017/03/09 Javascript
Vue.2.0.5过渡效果使用技巧
2017/03/16 Javascript
node跨域转发 express+http-proxy-middleware的使用
2018/05/31 Javascript
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
2020/02/06 NodeJs
Python实现的一个找零钱的小程序代码分享
2014/08/25 Python
Python数据结构之哈夫曼树定义与使用方法示例
2018/04/22 Python
python pandas获取csv指定行 列的操作方法
2019/07/12 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
2019/07/31 Python
keras获得某一层或者某层权重的输出实例
2020/01/24 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
html+css实现自定义图片上传按钮功能
2019/09/04 HTML / CSS
美国相机和电子产品零售商:Beach Camera
2020/11/26 全球购物
JAVA程序设计笔试题面试题一套
2015/07/28 面试题
七匹狼男装广告词
2014/03/21 职场文书
中介业务员岗位职责
2014/04/09 职场文书
六一儿童节演讲稿
2014/05/23 职场文书
李开复演讲稿
2014/05/24 职场文书
办公室主任个人总结
2015/02/28 职场文书
律师催款函范文
2015/06/24 职场文书
Django rest framework如何自定义用户表
2021/06/09 Python
python创建字典及相关管理操作
2022/04/13 Python