2015-06-05 133 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