2015-06-05 170 views
3

我想使用請求庫將一些JSON數據發送到Flask應用程序。我希望從服務器獲得application/json。當我使用郵差時,這工作正常,但是當我使用請求時,我得到application/html使用請求將JSON發送到Flask

import requests 
server_ip = 'server_ip:port/events' 
headers = {'Content-Type': 'application/json'} 
event_data = {'data_1': 75, 'data_2': -1, 'data_3': 47, 'data_4': 'SBY'} 
server_return = requests.post(server_ip, headers=headers, data=event_data) 
print server_return.headers 
{'date': 'Fri, 05 Jun 2015 17:57:43 GMT', 'content-length': '192', 'content-type': 'text/html', 'server': 'Werkzeug/0.10.4 Python/2.7.3'} 

爲什麼Flask看不到JSON數據並正確響應?

回答

13

您目前沒有發送JSON數據。您需要設置參數json,而不是data。在這種情況下,您無需自己設置content-type

r = requests.post(url, json=event_data) 

text/html頭,你看到的是響應的內容類型。 Flask似乎在發送一些HTML給你,這看起來很正常。如果您期望返回application/json,可能這是由於您沒有正確發送JSON數據而返回的錯誤頁面。

您可以使用request.json閱讀Flask中的json數據。

from flask import request 

@app.route('/events', methods=['POST']) 
def events(): 
    event_data = request.json 
3

我不認爲請求自動將數據編碼爲標題格式。你需要自己做。

import json 
... 

server_return = requests.post(server_ip, headers=headers, data = json.dumps(event_data)) 
+0

雖然這在技術上是正確的,但您也可以讓請求使用'json'參數爲您執行此操作。 – davidism

+0

這會更好我不知道這是可能的 – kevswanberg

+0

因爲它有誤導性,刪除你的答案可能不是壞事,儘管這完全是個人選擇的問題。我知道有些人不喜歡失去聲望,但在你的情況下,它似乎沒有太大的區別;-) – holdenweb