解析tornado查询参数:

  • self.request.query_arguments
  • self.get_query_argument[s](参数名称)

解析tornado的post参数:

  • self.request.body_arguments
  • self.get_body_argument[s](参数名称)

get,post解析参数都可:

  • self.get_argument[s](参数名称)

原始的post参数:

  • post_data = self.request.body.decode('utf-8')

headers参数:self.request.headers,对象(字典对象)

在项目中解析post参数时,发现以下问题:

request.body_arguments可以获取到form数据,但不能获取到curl过来的json数据
request.body.decode('utf-8')可以获取到所有的数据,但是是原始数据。
如果原始数据是curl过来json数据:直接json.loads(***)即可。
如果原始数据是form数据:直接json.loads(*)将抛出异常,因为数据格式是: username=abc%E5%8C%97%E4%BA%AC&email=&website=abc&language=%E4%B8%AD%E5%9B%BD

解决方法:

        post_data = self.request.body_arguments
post_data = {x: post_data.get(x)[0].decode("utf-8") for x in post_data.keys()}
if not post_data:
post_data = self.request.body.decode('utf-8')
post_data = simplejson.loads(post_data)

示例:

index.html

<!DOCTYPE html>
<html>
<head>
<title>sign in your name</title>
<link rel="icon" href="#" type="image/x-icon" />
<link rel="shortcut icon" href="#" type="image/x-icon" />
</head>
<body>
<h2>Please sing in.</h2>
<form method="post" action="/user">
<p>Name:<br><input type="text" name="username"></p>
<p>Email:<br><input type="text" name="email"></p>
<p>Website:<br><input type="text" name="website"></p>
<p>Language:<br><input type="text" name="language"></p>
<input type="submit" value="ok,submit my information">
</form>
</body>
</html>

user.html

<!DOCTYPE html>
<html>
<head>
<title>sign in your name</title>
<link rel="icon" href="#" type="image/x-icon" />
<link rel="shortcut icon" href="#" type="image/x-icon" />
</head>
<body>
<h2>Your Information</h2>
<p>Your name is {{username}}</p>
<p>Your email is {{email}}</p>
<p>Your website is {{website}}, it is very good. This website is make by {{language}}</p>
</body>
</html>

server.py

#!/usr/bin/env python
#coding:utf-8
import json
import tornado.web
import tornado.httpserver
import tornado.ioloop
import os
from tornado.options import define, options
define("port", default=9000, help="server port", type=int) class IndexHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
# 显示index.html模板,但是此时并没有向模板网页传递任何数据,仅仅显示罢了
self.render("index.html") class CreateUserHandler(tornado.web.RequestHandler):
def post(self, *args, **kwargs):
# json
post_data = self.request.body_arguments
post_data = {x: post_data.get(x)[0].decode("utf-8") for x in post_data.keys()}
if not post_data:
post_data = self.request.body.decode('utf-8')
post_data = json.loads(post_data)
# 不仅仅是要引用模板网页user.html,还要向这个网页传递一些数据,
# 例如username = user_name,含义就是,
# 在模板中,某个地方是用username来标示得到的数据,
# 而user_name是此方法中的一个变量,也就是对应一个数据,
# 那么模板中的username也就对应了user_name的数据,
# 这是通过username = user_name完成的 self.render("user.html", **post_data) # user_name的数据是哪里来的呢?就是在index.html页面的表单中提交上来的。
# 注意观察路径的设置,r"/user", CreateUserHandler,也就是在form中的action = '/user',
# 就是要将数据提交给UserHandler处理,并且是通过post方法。所以,在UserHandler类中,有post()
# 方法来处理这个问题。 handlers = [
(r"/", IndexHandler),
(r"/user", CreateUserHandler)
]
# 获取存放模板目录template的路径
template_path = os.path.join(os.path.dirname(__file__), "template") if __name__ == '__main__':
options.parse_command_line()
app = tornado.web.Application(handlers=handlers,
template_path=template_path)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

运行:

python2.7 plat.py --port=8000

访问index.html:

http://127.0.0.1:8000/

填写form表单, 提交数据,自动跳转到user.html

使用curl提交post数据:

curl -H "Content-Type:application/json" -X POST --data '{"username": "北京1245", "website": "3222w", "email": "adsf@sdfa.com", "language": "方言"}' http://127.0.0.1:8000/user

tornado解析post数据的问题的更多相关文章

  1. jQuey知识点三 解析json数据

    1.解析简单数据 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="vie ...

  2. iOS关于XML解析请求数据

    XML数据的请求: 和json请求几乎一样,只有请求参数修改为xml即可: AFHTTPSessionManager *manager = [AFHTTPSessionManager manager] ...

  3. 使用Python解析JSON数据的基本方法

    这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下:     ----------------------------------- ...

  4. iOS解析XML数据

    iOS中解析XML数据的类是  NSXMLParser,详细使用方法如下: 假设现在在内存中有XML的二进制数据对象(NSData):data(该数据可能来自网络,也可能是本地的文件数据),设置NSX ...

  5. 使用jQuery解析JSON数据

    我们先以解析上例中的comments对象的JSON数据为例,然后再小结jQuery中解析JSON数据的方法. 上例中得到的JSON数据如下,是一个嵌套JSON: {"comments&quo ...

  6. oracle xmltype导入并解析Excel数据 (四)特别说明

    1.Excel导出,此处没有给出 2.错误原因在中间表,T_EXCEL_IMPORT_GENERATION,其中errormsg不为空的数据 3,中间表入库过程: 需要自己实现,为一个存储过程,存储过 ...

  7. oracle xmltype导入并解析Excel数据 (三)解析Excel数据

    包声明 create or replace package PKG_EXCEL_UTILS is -- Author: zkongbai-- Create at: 2016-07-06-- Actio ...

  8. oracle xmltype导入并解析Excel数据--前言

    通常,很多的时候,我们需要导入Excel数据到系统中,但是Excel数据需要我们去各种校验,比如身份证校验,手机号码校验等等. 校验失败的数据,提供Excel导出错误原因,提示给用户. 如此,如果校验 ...

  9. [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")

    javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢?   原因在于: ...

随机推荐

  1. CCF 2017-03-1 分蛋糕

    CCF 2017-03-1 分蛋糕 题目 问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, a2, -, an.小明想分给每个朋友至少重量为k的蛋糕.小 ...

  2. Vue+VSCode开发环境搭建

    时间2019.9月 1. 安装 nodeJS; 安装VScode 安装好nodeJS之后,默认会安装好npm 测试 nodeJS 和npm是否可以执行 node -v npm -v 1.1 VScod ...

  3. Vuex 刷新后数据丢失问题 Typescript

    问题描述:Vuex保存的数据在页面刷新后会全部丢失清除 问题解决方案:使用sessionstorage进行保存,在页面刷新时保存至sessionStorage,页面在加载时再进行填充   (另有vue ...

  4. template中实现加减乘除数学运算

    django模板只提供了加法的filter,没有提供专门的乘法和除法运算:django提供了widthratio的tag用来计算比率,可以变相用于乘法和除法的计算. # 加法{{value|add:1 ...

  5. 最近跟进一个CS项目,用到c#基础知识,准备开个分类记录一下

    C#在txt类文件中追加内容 string path = "test.txt";FileStream mystream = new FileStream(path, FileMod ...

  6. [技术翻译]您应该知道的13个有用的JavaScript数组技巧

    本次预计翻译三篇文章如下: 01.[译]9个可以让你在2020年成为前端专家的项目 02.[译]预加载响应式图像,从Chrome 73开始实现 03.[译]您应该知道的13个有用的JavaScript ...

  7. 常见User-Agent大全

    window.navigator.userAgent 1) Chrome Win7: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KH ...

  8. Wechat alert

    企业微信号登录--注册企业号或者企业微信 添加子部门 部门添加成员 创建应用 需要接收告警的人员关注企业号 企业号已经被部门成员关注 企业号有一个可以发送消息的应用,一个授权管理员,可以使用应用给成员 ...

  9. DDD总览

    DDD总览 领域驱动设计(DDD)编码实践   目录 写在前面DDD总览实现业务的3种常见方式基于业务的分包领域模型的门面——应用服务业务的载体——聚合根实体 vs 值对象聚合根的家——资源库创生之柱 ...

  10. 工程代码不编译src的java目录下的xml文件问题及解决

    IDEA的maven项目中,默认源代码目录下(src/main/java目录)的xml等资源文件并不会在编译的时候一块打包进classes文件夹,而是直接舍弃掉.如果使用的是Eclipse,Eclip ...