2016-10-22 225 views
1

我想使用燒瓶POST數據到網站,當我嘗試返回數據時,我得到一個400錯誤的請求錯誤。Python燒瓶POST 400壞請求錯誤

這裏是發送POST請求我的Python代碼:

import requests 
from random import randint 

def Temp(): 
return randint(0,20) 


data = {'windspeed':WindSpeed(), 'Temp': Temp(), 'WindDir':WindDir()} 
r = requests.post('http://10.0.0.119', data = data) 
print (r.text) 

這是服務器代碼:

from flask import Flask, request, render_template 


app = Flask(__name__) 

@app.route("/", methods=['GET','POST']) 
def result(): 
    data = request.get_json(force=True) 
    Temp = data['Temp'] 
    return render_template('main.html', name=Temp) 

if __name__ == "__main__": 
app.run() 

在AA瀏覽器中運行時,這會返回一個400錯誤,但客戶端腳本得到正確的答案:

<!DOCTYPE html> 
<html> 
<body> 

<h1>Temperature</h1> 
<p>15</p> 

</body> 
</html> 

其中15是數據['Temp']變量。

+0

您的客戶端無法同用一個瀏覽器發佈時。問題是'get_json()'希望數據是JSON格式,但是使用普通帖子將發送表單編碼數據。使用'json ='而不是'data ='或'data = json.dumps(data)'。或者,更好的是,在您的服務器中,只需使用數據作爲字典。 – mhawke

回答

3

如果你只是導航到http://10.0.0.119那麼你發送一個GET請求來def result()這將導致不好的請求,因爲沒有data['Temp']

爲了使在瀏覽器中,您將需要這項工作從應用程序本身發送POST請求,然後有辦法查看它。

您的應用可以是:

import requests 
from random import randint 

from flask import Flask, request, render_template 


app = Flask(__name__) 

def Temp(): 
    return randint(0,20) 

@app.route("/", methods=['GET','POST']) 
def result(): 
    if request.method == 'POST': 
     data = request.form.get('data') 
     Temp = data['Temp'] 
     return render_template('dispaly_data.html', name=Temp) 
    else: 
     data = {'Temp': Temp()} 
     return render_template('post_data.html', data=data) 


if __name__ == "__main__": 
    app.run() 

和你在post_data.html形式可能是這樣的:

<form action="/" method='post'> 
    <input type="hidden" name="data" value="{{ data }}"/> 
    <input type='submit' value='Send Post'> 
</form> 
2

您發送錯誤的請求。你必須使用json=data把它發送的JSON

r = requests.post('http://10.0.0.119', json=data) 
0

你是不是在你的客戶張貼JSON和也不是你的瀏覽器,所以不要嘗試處理它作爲JSON在您的服務器。剛剛接觸使用request.form POST請求或request.args值GET請求:

@app.route("/", methods=['GET','POST']) 
def result(): 
    if request.method == 'POST': 
     data = request.form 
    else: 
     data = request.args 

    temp = data.get('Temp') 
    return render_template('main.html', name=temp)