龙卷风有正确的请求体,但找不到正确的参数

时间:2016-10-30 20:25:18

标签: python tornado

制作一个非常简单的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的错误处理非常好,我希望尽可能避免重写它。

所以,我的基本问题是这怎么可能?它正在打印正确的请求正文,然后以某种方式无法访问它刚刚打印的字典。

3 个答案:

答案 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