post接受json tornado_tornado解析post数据的问题

本文介绍了在Tornado框架下解析POST请求时遇到的问题,包括如何获取query、body参数。当post_data为JSON格式时,使用`json.loads()`解析;若为form数据,则需先解码再解析。示例代码展示了如何处理这两种情况,并提供了curl命令示例进行POST提交。
摘要由CSDN通过智能技术生成

解析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 inpost_data.keys()}if notpost_data:

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

post_data= simplejson.loads(post_data)

示例:

index.html

sign in your name

Please sing in.

Name:

Email:

Website:

Language:

user.html

sign in your name

Your Information

Your name is {{username}}

Your email is {{email}}

Your website is {{website}}, it is very good. This website is make by {{language}}

server.py

#!/usr/bin/env python#coding:utf-8

importjsonimporttornado.webimporttornado.httpserverimporttornado.ioloopimportosfrom tornado.options importdefine, options

define("port", default=9000, help="server port", type=int)classIndexHandler(tornado.web.RequestHandler):def get(self, *args, **kwargs):#显示index.html模板,但是此时并没有向模板网页传递任何数据,仅仅显示罢了

self.render("index.html")classCreateUserHandler(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 inpost_data.keys()}if notpost_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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值