制作一个非常简单的Tornado应用程序,但基于我对Tornado的理解,这似乎是不可能的事情。简而言之,我得到了以下RequestHandler
:
class CreateUserHandler(tornado.web.RequestHandler):
def post(self):
print self.request.body
print self.get_body_argument("email")
# Do other things
以下是印刷品:
{"email":"slater@indico.io","password":"password"}
WARNING:tornado.general:400 POST /user/create/ (::1): Missing argument email
因此,电子邮件显然存在于正文中,但在尝试访问它时会产生400。我可以手动解析请求体,但是Tornado的错误处理非常好,我希望尽可能避免重写它。
所以,我的基本问题是这怎么可能?它正在打印正确的请求正文,然后以某种方式无法访问它刚刚打印的字典。
答案 0 :(得分:2)
get_body_argument
适用于表单编码数据。 Tornado几乎不支持请求体中的JSON数据。你可以简单地说:
import json
class CreateUserHandler(tornado.web.RequestHandler):
def post(self):
data = json.loads(self.request.body)
print data.get("email")
答案 1 :(得分:2)
这里有一个小助手方法,我已经添加到我的处理程序中,以便将所有正文参数作为词典检索:
from tornado.web import RequestHandler
from tornado.escape import json_decode
class CustomHandler(RequestHandler):
def get_all_body_arguments(self):
"""
Helper method retrieving values for all body arguments.
Returns:
Dict of all the body arguments.
"""
if self.request.headers['Content-Type'] == 'application/json':
return json_decode(self.request.body)
return {arg: self.get_body_argument(arg) for arg in self.request.arguments}
答案 2 :(得分:0)
不确定为什么会这样,但我找到了解决方法。它需要对身体进行url编码(这对我来说非常奇怪,因为它是请求有效负载),并将Content-Type
标题更改为application/x-www-form-urlencoded
这是上面脚本的新输出:
email=slater%40indico.io&password=password
slater@indico.io