Flask - 从Angular $ http.post()获取POST数据

时间:2015-05-21 10:53:21

标签: javascript python angularjs post flask

在我正在制作的一个非常基本的测试网络应用程序中,我在提交表单时使用angular来运行一个函数。该函数异步地将数据发布到我构建的简单api,该api应该根据它接收的POST信息将数据输入到数据库中。看起来POST在前端工作正常,但我无法从Flask访问request.json或获取任何发布数据。我觉得这个问题可能是我忽略的一些简单问题,但截至目前我根本无法解决这个问题。以下是一些代码:

AngularJS:

$scope.submitAddMsg = function (){
        var data = {'author': $scope.msgauthor, 'message': $scope.msgmsg};
        $http.post('/addMessage', data, {headers: {'Content-Type': 'application/json'}}).
        success(function(data, status, headers, config) {
            console.log(data);
            console.log(status);
            console.log(headers);
            console.log(config);
        }).
        error(function(data, status, headers, config) {
            alert(JSON.parse(data));
        });
    };

/addMessage

的Flask视图功能
@app.route('/addMessage', methods=['POST'])
def addMessage():
    #results in 'None type not iterable'
    #response = request.form.get('author')

    #results in a 400 error
    #response = request.get_json()

    #results in a 400 error
    #response = request.get_json()

    #results in 'author' not defined
    #name = request.args.get('author')
    #return jsonify(author = author)

    return str(jsonify(response))

我无法停止收到错误,好像请求不是我认为应该是的,我还应该做些什么来正确处理这个问题?因为我在使用Angular发送POST时甚至无法访问具有有效负载的REST客户端时都无法访问任何POST信息。

以下是JavaScript控制台,可以看到datastatusheadersconfig最终成为POST后运行的成功函数:

<Response 46 bytes [200 OK]>
testbase.js:53 200
testbase.js:54 function (c){a||(a=Xc(b));return c?(c=a[z(c)],void 0===c&&    (c=null),c):a}
testbase.js:55 Object {method: "POST", transformRequest: Array[1],     transformResponse: Array[1], headers: Object, url: "/addMessage"…}data:     Objectheaders: ObjectAccept: "application/json, text/plain, */*"Content-Type:     "application/json"__proto__: Objectmethod: "POST"transformRequest:     Array[1]transformResponse: Array[1]url: "/addMessage"__proto__: Object

非常感谢任何有关正常工作的帮助,如果您需要更多信息,请告知我们

2 个答案:

答案 0 :(得分:0)

您可以使用request.data获取原始发布数据。

您还可以将silent的{​​{1}}标记设置为get_json,这样您就可以获得确切的失败信息。

来自docs

  

get_json(force = False,silent = False,cache = True)

     

参数:
     force - 如果设置为True,则忽略mimetype      silent - 如果设置为False,则此方法将以静默方式失败并返回False      cache - 如果设置为True,则会在请求中记住已解析的JSON数据。

答案 1 :(得分:0)

尝试在启动应用之前添加#,然后重试。

您还可以尝试: message = request.json.get(&#39; message&#39;)

我也会尝试将此放入你的路线

[&#39; POST&#39;,&#39; OPTIONS&#39;])