烧瓶应用程序从卷曲工作,而不是从请求
问题描述:
下面是我正在处理的休息api的一些代码。我从教程发现here获得了这个。它正在工作,并使用下面的curl命令来最终添加一个部落。烧瓶应用程序从卷曲工作,而不是从请求
curl -H "Content-Type: application/json" -X POST -d '{"data":[ {"group" : "Read a book"}] }' http://localhost:5000/group_es/api/v1.0/group
烧瓶应用程序本身的代码如下。
from flask import Flask, jsonify, abort, make_response, request
app = Flask(__name__)
groups = [
{
'id': 1,
'title': u'Buy groceries',
'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
'done': False
},
{
'id': 2,
'title': u'Learn Python',
'description': u'Need to find a good Python tutorial on the web',
'done': False
}
]
@app.route('/group_es/api/v1.0/group', methods=['GET'])
def get_tribes():
return jsonify({'group': groups})
@app.errorhandler(404)
def not_found(error):
return make_response(jsonify({'error': 'Not found'}), 404)
@app.route('/group_es/api/v1.0/group', methods=['POST'])
def create_group():
if not request.json or not 'data' in request.json:
abort(400)
groups = request.json['data']
return jsonify({'group': groups}), 20
@app.route('/group_es/api/v1.0/group', methods=['PUT'])
def update_group():
print 'REQUEST', request.json
groups = request.json['data']
return jsonify({'group': groups}), 20
反正我试图curl命令转换成蟒蛇的要求,使用要求库:
import json
from requests import put, post, request
headers = {'content-type': 'application/json'}
In[6]: put('http://localhost:5000/group_es/api/v1.0/group', params={'data': [{'adam':'name'}] }, headers=headers)
Out[6]: <Response [400]>
然而,失败的话,你可以看到。我不知道这是由于烧瓶库本身造成的,也不是由于与curl不同步的不正确的请求命令。
我也试图在头作为字典传递和使用JSON
resp = put('http://localhost:5000/tribe_es/api/v1.0/tribe', data=json.dumps({'data':'adam'}),headers={'content-type':'application/json'})
这将导致一个错误,我还没有看到转储数据之前:
ConnectionError: ('Connection aborted.', BadStatusLine('HTTP/1.0 20 UNKNOWN\r\n',))
会如果有人可以协助,为什么requests
不工作,但curl
工作正常!
答
你是不是在这里发送JSON:
put('http://localhost:5000/group_es/api/v1.0/group', params={'data': [{'adam':'name'}] }, headers=headers)
params
将数据编码为X WWW的URL编码数据。改为使用json
关键字;在Content-Type头将作相应调整,所以你不需要手动设置标题:
put('http://localhost:5000/group_es/api/v1.0/group', json={'data': [{'adam':'name'}] })
你curl
命令行中使用POST
,不PUT
,但你的PUT
处理程序也断了。状态实际上意味着你的代码工作,但你的PUT
处理程序返回状态20
,不200
:
return jsonify({'group': groups}), 20
取出, 20
; 200是返回的默认状态码。或者像教程中一样使用201
;这意味着创建而不是好:
return jsonify({'group': groups}), 201
假如你使用post()
相反,你会看到你的data=json.dumps()
方法工作正常。如果你使用卷曲符号-X PUT
,你可能会看到与状态码相同的问题。