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实现的各种排序算法代码
Mar 04 Python
python实现红包裂变算法
Feb 16 Python
python实现数据图表
Jul 29 Python
python 显示数组全部元素的方法
Apr 19 Python
Python Threading 线程/互斥锁/死锁/GIL锁
Jul 21 Python
Python中PyQt5/PySide2的按钮控件使用实例
Aug 17 Python
pytorch 预训练层的使用方法
Aug 20 Python
Python 实现try重新执行
Dec 21 Python
Python 添加文件注释和函数注释操作
Aug 09 Python
Django正则URL匹配实现流程解析
Nov 13 Python
Django框架实现在线考试系统的示例代码
Nov 30 Python
Python自动化实战之接口请求的实现
May 30 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
让这部DC动画新作刷新你的认知
2020/03/03 欧美动漫
PHP VS ASP
2006/10/09 PHP
一个很不错的PHP翻页类
2009/06/01 PHP
PHP If Else(elsefi) 语句
2013/04/07 PHP
PHP多线程类及用法实例
2014/12/03 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
PHP执行linux命令6个函数代码实例
2020/11/24 PHP
不错的asp中显示新闻的功能
2006/10/13 Javascript
Javascript 各浏览器的 Javascript 效率对比
2008/01/23 Javascript
jQuery 判断元素上是否绑定了事件
2009/10/28 Javascript
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
js实现运动logo图片效果及运动元素对象sportBox使用方法
2012/12/25 Javascript
简述JavaScript中正则表达式的使用方法
2015/06/15 Javascript
JS实现可关闭的对联广告效果代码
2015/09/14 Javascript
本地Bootstrap文件字体图标引入却无法显示问题的解决方法
2020/04/18 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
2017/05/02 Javascript
利用node.js实现反向代理的方法详解
2017/07/24 Javascript
利用vscode调试编译后的js代码详解
2018/05/14 Javascript
npm配置国内镜像资源+淘宝镜像的方法
2018/09/07 Javascript
vue中使用codemirror的实例详解
2018/11/01 Javascript
Vue实现移动端页面切换效果【推荐】
2018/11/13 Javascript
Vue使用vue-draggable 插件在不同列表之间拖拽功能
2020/03/12 Javascript
[44:30]完美世界DOTA2联赛PWL S2 GXR vs Magma 第一场 11.25
2020/11/26 DOTA
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
利用python numpy+matplotlib绘制股票k线图的方法
2019/06/26 Python
微信小程序python用户认证的实现
2019/07/29 Python
python 实现提取log文件中的关键句子,并进行统计分析
2019/12/24 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
如何基于matlab相机标定导出xml文件
2020/11/02 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
2020/11/17 Python
蒙蒂塞罗商店:Monticello Shop
2018/11/25 全球购物
装修施工安全责任书
2014/07/24 职场文书
平安建设汇报材料
2014/12/29 职场文书
2015年手术室工作总结
2015/05/11 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
爱岗敬业事迹材料
2019/06/20 职场文书