解析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 namePlease sing in.
Name:
Email:
Website:
Language:
user.html
sign in your nameYour 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