【问题标题】:Flask - Getting POST data from Angular $http.post()Flask - 从 Angular $http.post() 获取 POST 数据
【发布时间】:2015-05-21 10:53:20
【问题描述】:

在我正在制作的一个非常基本的测试网络应用程序中,我在提交表单时使用 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 信息,而 Angular 是如何发送数据的。

这是 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

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

【问题讨论】:

    标签: javascript python angularjs post flask


    【解决方案1】:

    您可以使用request.data 获取原始帖子数据。

    您还可以将get_jsonsilent 标志设置为True,这样您就可以得到准确的失败消息。

    来自docs

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

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

    【讨论】:

    • 我也试过了(忘了在上面写了)并相信又出现了 400 错误,但我可以仔细检查一下,如果这些都不能正常工作,一定是小问题,我没有明白为什么requests 不是我所期望的那样,顺便说一句,它也被导入了
    • 你可以手动编写一个简单的 json (甚至是一个空的 json )并尝试在烧瓶中读回它,看看它是否真的与正在传递的数据有问题,或者你可以删除来自 $http.post() 的标头,让烧瓶猜测 mimetype。
    • 不幸的是,我已经尝试过这些,但它们会导致类似的失败。似乎每当尝试访问请求对象中通常存在的任何内容时,什么都不存在,并且会导致 400 错误。我不确定 Flask 是否错误地处理了请求或类似的事情,当我在我的代码前面时,我可以尝试其他一些事情,但请求对象基本上不是我认为的应该的对象
    • 好的@Anbarasan,所以在烧瓶中当我return str(type(request.data)) 我得到,它不应该是文本或json,以便我可以将它用作字典吗?
    • 但是如果我只是返回 request.data 或 request.get_data() Javascript 会在控制台中记录正确的数据,所以我知道它被正确传递了,但是无论出于何种原因,当 Python 获取时它都是字节类型无法使用
    【解决方案2】:

    在启动应用之前尝试添加app.debug = True,然后重试。

    您也可以尝试: message = request.json.get('message')

    我也会尝试把它放在你的路线中

    ['POST', 'OPTIONS'])

    【讨论】:

      猜你喜欢
      • 2019-04-19
      • 1970-01-01
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多