Ajax JSON请求总是不发送?

时间:2017-05-28 18:42:27

标签: javascript jquery python json ajax

我正在创建一个非常简单的演示网络应用。我想要的只是按下按钮,让消息从前端到后端,然后传回前端。没什么好看的。

我无法获得" data1" (在JS中)可以在Pyhton / Flask中访问。我不确定问题是我是如何从JS发送的,也不是我如何在Python中访问它。根据我读过的其他问题,我似乎正确地做到了。在JS中我使用data : JSON.stringify(data1)发送,在python中我使用data = request.json进行访问。那么这里有什么问题?

我尝试使用request.json,request.get_json()访​​问它,并尝试在没有JSON的情况下进行访问,只是发送"数据",并通过request.form.get访问它(&# 39;字&#39)。但这些似乎都不起作用。

Cmd Line Output:

xxxxxx@ezri:~/Desktop/flaskwebapp$ python webapp_starter.py
 * Running on http://127.0.0.1:8000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger pin code: 276-649-445
127.0.0.1 - - [28/May/2017 10:48:49] "GET / HTTP/1.1" 200 -
<Request 'http://127.0.0.1:8000/examplemethod' [POST]>
data None
127.0.0.1 - - [28/May/2017 10:48:54] "POST /examplemethod HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/home/castro/anaconda2/lib/python2.7/site-packages/flask/app.py", line 1994, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/castro/anaconda2/lib/python2.7/site-packages/flask/app.py", line 1985, in wsgi_app
    response = self.handle_exception(e)
  File "/home/castro/anaconda2/lib/python2.7/site-packages/flask/app.py", line 1540, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/castro/anaconda2/lib/python2.7/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/castro/anaconda2/lib/python2.7/site-packages/flask/app.py", line 1615, in full_dispatch_request
    return self.finalize_request(rv)
  File "/home/castro/anaconda2/lib/python2.7/site-packages/flask/app.py", line 1630, in finalize_request
    response = self.make_response(rv)
  File "/home/castro/anaconda2/lib/python2.7/site-packages/flask/app.py", line 1725, in make_response
    raise ValueError('View function did not return a response')
ValueError: View function did not return a response

此错误显然是因为使用request.json通过flask中的赋值始终为数据分配None。所以真正的错误似乎是将数据从JS正确地提供给Python。

HTML

<!DOCTYPE html>
<html>
<head>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
  <script type="text/javascript" src="static/example.js"></script>
</head>
<body>

<h1 class="title">Heading</h1>
<p>a paragraph of text bla bla bla</p>
<button id="btn"> CLICK ME! </button>

</body>
</html>

使用Javascript:

"use strict";

console.log("On load");

var main = function() {
    var run_method = function(){

      var data1 = {"word":"hello"}
      console.log("Before " + data1);
      $.ajax({
          url : "/examplemethod",
          type : "POST",
          data : JSON.stringify(data1),
          contentType: 'application/json; charset=utf-8',
          dataType: 'json',

      })
      .done(function(data){
          // Parse out image info
          var data = JSON.parse(data);
          console.log(data);

      });
    }

    $("#btn").on("click",function(){
        //event.preventDefault();
          run_method()
    })
}



$(document).ready(main);

的Python /烧瓶中:

from flask import Flask, render_template,request

#Init flask server
app = Flask(__name__)

@app.route("/")
def initialize():
    '''
    Initialize the page

    IN: None
    OUT: None (loads page)
    '''
    #render page from html
    return render_template('index.html')

@app.route("/examplemethod", methods=['POST', 'GET'])
def example_method():
    global data
    if request.method == 'POST':
        print request
        data = request.json
        #request.form.get('word')
        print "data", data
    return data

if __name__ == '__main__':
    app.run(host="127.0.0.1", port=int("8000"), debug=True)

3 个答案:

答案 0 :(得分:0)

在$ .ajax调用中,数据选项必须是对象,查询字符串或数组。 JSON字符串不起作用。所以只需用data1替换'JSON.stringify(data1)'。

在Flask方面,您似乎需要通过使用request.form ['word']和来自GET方法request.args.get('word')来访问POST方法发送的请求信息。另外,方法和路线需要匹配吗?例如'/ examplemethod'和'def examplemethod'?我不熟悉Flask的命名约定:

#At top of file
from Flask import jsonify

@app.route("/examplemethod", methods=['POST', 'GET'])
def example_method():
    global data
    if request.method == 'POST':
        print request
        data = request.form['word']
        print "POST", data
    elif request.method == 'GET':
        print request
        data = request.args.get('word')
        print "GET", data
    return jsonify(data)

您还可能需要在Flask中使用jsonify功能。请参阅有关在Flask中使用jQuery的文档:http://flask.pocoo.org/docs/0.12/patterns/jquery/

答案 1 :(得分:0)

我明白了。

老实说,我并非100%确定我采取了哪些措施来解决这个问题。我将差异检查器中的代码与上面发布的内容进行了比较,但发现所有更改都是打印语句,或者在成功请求后使用/修改数据,因此不知道这些更改是否已修复它。

我邀请其他人试着弄清楚改变了什么。

JS

var run_method = function(){

  var data1 = {"word":"hello"}
  console.log("Before " + data1["word"]);
  $.ajax({
      url : "/examplemethod",
      type : "POST",
      data : JSON.stringify(data1),
      contentType: 'application/json; charset=utf-8',
      dataType: 'json',

  })
  .done(function(data){
      console.log("After " +data["word"]);
  });
}

的Python

@app.route("/examplemethod", methods=['POST', 'GET'])
def example_method():
    global data
    if request.method == 'POST':
        print "POST REQ:", request
        data = request.json
        print "data", data

    data["word"] = "goodbye!"
    return JSONEncoder().encode(data)

答案 2 :(得分:0)

试试get_json(force=True)。它强制并将数据转换为json(dict)格式。浏览器可能没有发送正确的内容类型,因为.json失败但get_json给出了正确的结果。

您可以使用request.headers检查标题。

我刚试过你的代码,我得到了以下结果

  1. 使用request.json

    {'word': 'hello'}

  2. 使用request.form

    ImmutableMultiDict([])

  3. get_json(force=True)

    {'word': 'hello'}

  4. 另外docs

      

    应该使用get_json()方法。