龙卷风 post 请求:缺少参数

tornado post request: missing argument

我正在使用 tornado 构建 Web 服务器,现在我正在创建登录模块。这是代码:

<body>
    <form id="uploadForm">
      <div class="form-group">
        <label for="exampleInputEmail1">Email address</label>
        <input name="name" type="email" class="form-control" id="exampleInputEmail1" placeholder="Email">
      </div>
      <div class="form-group">
        <label for="exampleInputPassword1">Password</label>
        <input name="password" type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
      </div>
      <button id="submit" type="button" class="btn btn-default">Submit</button>
    </form>
</body>
    <script src="../js/plugins/jquery-3.2.1.min.js?v=c9f5aeeca3"></script>
    <script src="../js/common/bootstrap.min.js?v=5869c96cc8"></script>
    <script>
        $(function(){
            $('#submit').on('click',function(){
                $.ajax({
                    url: 'http://www.example.com/login',
                    method: 'POST',
                    data: $('#uploadForm').serialize(),
                    contentType: false,
                    processData: false,
                    cache: false,
                    success: function(data) {
                        console.log(data);
                        if( data === 'ERROR'){
                            alert('login failed')
                        }else{
                            location.href = data;
                        }
                    },
                    error: function (jqXHR) {
                        alert('ERROR');
                    }
                });
            });
        });
    </script>

以及后端部分:

class LoginHandler(tornado.web.RequestHandler):
    def post(self, path):
        try:
            print(self.request.body)
            name = self.get_body_argument("name")
        except Exception as e:
            print(e)

当我进行测试时,我可以看到 print(self.request.body) 给出了结果:b'name=test&password=tttt' 但在那之后我得到了一个异常:

HTTP 400: Bad Request (Missing argument name)

name=test 就在 http 正文中,但为什么它告诉我缺少参数名称?

Tornado 仅支持 "application/x-www-form-urlencoded" 和 "multipart/form-data" 作为内容类型。所以当我们向服务器发送post请求时,我们必须发送带有正确contentType的请求。例如,

$.ajax({
            url: 'http://www.example.com/login',
            method: 'POST',
            data: $('#uploadForm').serialize(),
            contentType: 'application/x-www-form-urlencoded',
            processData: false,
            ...

此外,我们可以忽略ajax中的contentType,因为默认设置为'application/x-www-form-urlencoded'