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中的类学习笔记
Sep 23 Python
在Django框架中编写Contact表单的教程
Jul 17 Python
python实现简单点对点(p2p)聊天
Sep 13 Python
Python实现字符串反转的常用方法分析【4种方法】
Sep 30 Python
python多维数组切片方法
Apr 13 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
Nov 07 Python
python实现windows倒计时锁屏功能
Jul 30 Python
python画环形图的方法
Mar 25 Python
使用Django实现把两个模型类的数据聚合在一起
Mar 28 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
Apr 14 Python
如何使用Python实现一个简易的ORM模型
May 12 Python
用Python生成会跳舞的美女
Jan 18 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日期时间函数的高级应用技巧
2009/05/16 PHP
fleaphp常用方法分页之Pager使用方法
2011/04/23 PHP
9个实用的PHP代码片段分享
2015/01/22 PHP
PHP Yii框架之表单验证规则大全
2015/11/16 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
php静态成员方法和静态的成员属性的使用方法
2017/10/26 PHP
php接口隔离原则实例分析
2019/11/11 PHP
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
js jquery获取随机生成id的服务器控件的三种方法
2013/07/11 Javascript
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
2013/10/11 Javascript
开源的javascript项目Kissy介绍
2014/11/28 Javascript
JavaScript实现在标题栏上显示当前日期的方法
2015/03/19 Javascript
jQuery数组处理函数整理
2016/08/03 Javascript
轻松搞定js表单验证
2016/10/13 Javascript
jQuery基于排序功能实现上移、下移的方法
2016/11/26 Javascript
JavaScript对象_动力节点Java学院整理
2017/06/23 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
2017/11/22 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
2017/12/05 jQuery
vue项目上传Github预览的实现示例
2018/11/06 Javascript
vuex如何重置所有state(可定制)
2019/01/17 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
Python自动化运维和部署项目工具Fabric使用实例
2016/09/18 Python
浅谈Python peewee 使用经验
2017/10/20 Python
python 控制Asterisk AMI接口外呼电话的例子
2019/08/08 Python
Pycharm中Python环境配置常见问题解析
2020/01/16 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
简单了解Python多态与属性运行原理
2020/06/15 Python
python re.match()用法相关示例
2021/01/27 Python
维氏瑞士军刀英国网站:Victorinox英国
2019/07/04 全球购物
C#面试题
2016/05/06 面试题
Can a struct inherit from another struct? (结构体能继承结构体吗)
2016/09/25 面试题
小学班主任培训方案
2014/06/04 职场文书
工地标语大全
2014/06/18 职场文书
2015年元旦文艺晚会总结(学院)
2014/11/28 职场文书
2014年生产管理工作总结
2014/12/23 职场文书
公司副总经理岗位职责
2015/04/08 职场文书