2017-05-28 198 views
0

我正在创建一个非常简单的演示Web应用程序。我想要的只是按下按钮,并将消息从前端移到后端,然后传回前端。没有什么花哨。Ajax JSON请求始终不发送?

我无法在Pyhton/Flask中获取“data1”(在JS中)。我不确定这个问题是由我如何从JS发送它或我如何在Python中访问它。根据我读过的其他问题,我似乎正在做的正确。在JS中,我使用data : JSON.stringify(data1)发送,而在Python中,我使用data = request.json访问。那么这里有什么问题?

我尝试过使用request.json,request.get_json()来访问它,并试图在没有JSON的情况下做它,只是发送“数据”,并通过request.form.get('word')来访问它。但这些似乎都不起作用。

CMD线输出:

[email protected]:~/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烧瓶中的分配始终分配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) 
+0

尝试发送数据没有stringify –

+0

我做了,并使用request.form.get('word')来访问它,因为我说也没有工作。 –

+0

Priyesh意味着发送数据没有stringify,但仍然从烧瓶访问它作为'request.json',我认为jQuery的'ajax'调用内部的字符串化 – niceman

回答

0

在$就来电,数据选项必须是对象,查询字符串或数组。 JSON字符串不起作用。因此,只需用data1替换'JSON.stringify(data1)'即可。

在烧瓶侧面看起来则需要使用的request.form [“单词”]来访问由POST方法发送的请求信息,并从GET方法,request.args.get(“单词”)。另外,方法和路线需要匹配吗?例如'/ 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函数。请参阅使用jQuery with Flask的文档:http://flask.pocoo.org/docs/0.12/patterns/jquery/

+0

它们不是一样的要求(它们是下划线,所以它们实际上并不相同)。这只是一个惯例,或者更多的是个人偏好。 至于你的解决方案,我试图实施,搞砸了一些东西,然后试图解决它让它以我最初编写它的方式工作,但我不知道如何或为什么......所以...谢谢? –

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) 
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'}

另外docs

的get_json()方法应该被代替使用。