2017-05-28 99 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()方法應該被代替使用。