2016-02-26 60 views
2

我想发送一个从client.py创建的python字典到我的webservice,让webservice对数据做些什么,然后返回一个布尔值给client.py。这是代码我到目前为止对服务器和客户端:如何从烧瓶发送和接收数据?

服务器端(里面webservice.py):

from flask import Flask 
from flask import request 
import json 

app = Flask(__name__) 

@app.route('/determine_escalation',methods = ['POST']) 
def determine_escalation(): 
    jsondata = request.form['jsondata'] 
    data = json.loads(jsondata) 

    #stuff happens here that involves data to obtain a result 

    result = {'escalate':'True'} 
    return json.dumps(result) 


if __name__ == '__main__': 
    app.run(debug=True) 

客户端(内client.py):

import sys 
import json 
import requests 

conv = [{'input': 'hi', 'topic': 'Greeting'}] 
s = json.dumps(conv) 
res = requests.post("http://127.0.0.1:5000/determine_escalation",data=s) 
print res.text 

但是,当我打印出res.text,我得到这个:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> 
<title>400 Bad Request</title> 
<h1>Bad Request</h1> 
<p>The browser (or proxy) sent a request that this server could not understand.</p> 

我在做什么错,我该如何解决这个问题?新的Flask和JSON的东西,所以任何帮助表示赞赏。

回答

5

OK - 一些问题在这里:

首先,你可以使用requests.get_json()在服务器端检索您的JSON数据:

from flask import Flask 
from flask import request 
import json 

app = Flask(__name__) 

@app.route('/determine_escalation/', methods = ['POST']) 
def determine_escalation(): 
    jsondata = request.get_json() 
    data = json.loads(jsondata) 

    #stuff happens here that involves data to obtain a result 

    result = {'escalate': True} 
    return json.dumps(result) 


if __name__ == '__main__': 
    app.run(debug=True) 

此外,当你把你的数据在一起,而不是使用“数据= S”发送请求,用“JSON = S”:

import sys 
import json 
import requests 

conv = [{'input': 'hi', 'topic': 'Greeting'}] 
s = json.dumps(conv) 
res = requests.post("http://127.0.0.1:5000/determine_escalation/", json=s).json() 
print(res['escalate']) 

请注意,我在URL的末尾添加结尾的斜杠 - 这仅仅是很好的做法: - )

我还引入了MarcelK的建议更改 - 从布尔值'True'(服务器端)删除引号并使用.json()解析客户端的响应 - 这些都是很好的建议。

我测试过这个修订版(并重新修订版),它工作正常。

+2

要使其完成,您还可以将.json()附加到request.post(...)以直接解析json。在determine_escalation()中,当结果字典包含布尔值True而不是字符串'True'时,所有内容都应按预期工作;) – MarcelK

+0

非常感谢,Neil!对于那些可能会觉得这很有用的用户:通过执行sudo pip安装请求 - 升级来升级您的请求模块。否则,请求将不接受json参数.post – ilikecats

+0

自[请求2.4.2](http://docs.python-requests.org/en/master/community/updates/#id16)开始支持json参数, – MarcelK