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设计模式之观察者模式实例
Apr 26 Python
python Crypto模块的安装与使用方法
Dec 21 Python
详解Python中的动态属性和特性
Apr 07 Python
python利用smtplib实现QQ邮箱发送邮件
May 20 Python
使用 Python 实现微信群友统计器的思路详解
Sep 26 Python
padas 生成excel 增加sheet表的实例
Dec 11 Python
Python线上环境使用日志的及配置文件
Jul 28 Python
python  logging日志打印过程解析
Oct 22 Python
Python Tkinter模块 GUI 可视化实例
Nov 20 Python
解决ROC曲线画出来只有一个点的问题
Feb 28 Python
Pyinstaller 打包发布经验总结
Jun 02 Python
浅析python中特殊文件和特殊函数
Feb 24 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 应用程序的安全 -- 不能违反的四条安全规则
2006/11/26 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
Joomla调用系统自带编辑器的实现方法
2016/05/05 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
function, new function, new Function之间的区别
2007/03/08 Javascript
基于jquery 的一个progressbar widge
2010/10/29 Javascript
基于jQuery的前端数据通用验证库
2011/08/08 Javascript
javascript面向对象包装类Class封装类库剖析
2013/01/24 Javascript
JQuery设置文本框和密码框得到焦点时的样式
2013/08/30 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
AngularJS基础 ng-if 指令用法
2016/08/01 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
详解vue中引入stylus及报错解决方法
2017/09/22 Javascript
小程序开发基础之view视图容器
2018/08/21 Javascript
Vue filter 过滤当前时间 实现实时更新效果
2019/12/20 Javascript
Vue通过Blob对象实现导出Excel功能示例代码
2020/07/31 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
2020/10/22 Javascript
python控制nao机器人身体动作实例详解
2019/04/29 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
2019/08/14 Python
Python序列化pickle模块使用详解
2020/03/05 Python
Python语法垃圾回收机制原理解析
2020/03/25 Python
使用Python FastAPI构建Web服务的实现
2020/06/08 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
HTML5中drawImage用法分析
2014/12/01 HTML / CSS
泰国网上购物:Shopee泰国
2018/09/14 全球购物
意大利时尚精品店:Nugnes 1920
2020/02/10 全球购物
农民工工资支付承诺函
2014/03/31 职场文书
2014年民主评议党员工作总结
2014/12/02 职场文书
爱心募捐感谢信
2015/01/22 职场文书
项目经理岗位职责
2015/01/31 职场文书
反腐倡廉主题教育活动总结
2015/05/07 职场文书
2016教师年度考核评语大全
2015/12/01 职场文书
五年级作文之劳动作文
2019/11/12 职场文书
WordPress多语言翻译插件 - WPML使用教程
2021/04/01 PHP
详解vue身份认证管理和租户管理
2021/05/25 Vue.js
Mongo服务重启异常问题的处理方法
2021/07/01 MongoDB