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 简易计算器程序,代码就几行
Aug 29 Python
Python中对象迭代与反迭代的技巧总结
Sep 17 Python
elasticsearch python 查询的两种方法
Aug 04 Python
Python中的引用和拷贝实例解析
Nov 14 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
Jan 14 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
Feb 18 Python
如何理解Python中的变量
Jun 01 Python
python 解决mysql where in 对列表(list,,array)问题
Jun 06 Python
Python 字典一个键对应多个值的方法
Sep 29 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
Jan 15 Python
python中random模块详解
Mar 01 Python
利用Python第三方库实现预测NBA比赛结果
Jun 21 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使用缓存即时输出内容(output buffering)的方法
2015/08/03 PHP
php结合web uploader插件实现分片上传文件
2016/05/10 PHP
PHP7内核之Reference详解
2019/03/14 PHP
在laravel-admin中列表中禁止某行编辑、删除的方法
2019/10/03 PHP
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
JavaScript的Number对象的toString()方法
2015/12/18 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
Jquery鼠标放上去显示全名的实现方法
2017/02/06 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
fetch 如何实现请求数据
2018/12/20 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
python计算书页码的统计数字问题实例
2014/09/26 Python
python实现类的静态变量用法实例
2015/05/08 Python
python协程用法实例分析
2015/06/04 Python
Python爬取国外天气预报网站的方法
2015/07/10 Python
Python简单计算文件夹大小的方法
2015/07/14 Python
Python编程中字符串和列表的基本知识讲解
2015/10/14 Python
python+Django+apache的配置方法详解
2016/06/01 Python
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
对Python3中的input函数详解
2018/04/22 Python
python 巧用正则寻找字符串中的特定字符的位置方法
2018/05/02 Python
python 内置模块详解
2019/01/01 Python
解决django接口无法通过ip进行访问的问题
2020/03/27 Python
python实现二分查找算法
2020/09/18 Python
美国羊皮公司:Overland
2018/01/15 全球购物
在weblogic中发布ejb需涉及到哪些配置文件
2012/01/17 面试题
博士研究生自我鉴定范文
2013/12/04 职场文书
交通违章检讨书
2014/09/21 职场文书
工伤私了协议书范本
2014/11/24 职场文书
三峡导游词
2015/01/31 职场文书
社区五一劳动节活动总结
2015/02/09 职场文书
以权谋私检举信范文
2015/03/02 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
假如给我三天光明读书笔记
2015/06/26 职场文书
2015-2016年小学教导工作总结
2015/07/21 职场文书
Python实现PIL图像处理库绘制国际象棋棋盘
2021/07/16 Python