2015-03-03 55 views
0

下面是我正在处理的休息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工作正常!

回答

1

你是不是在这里发送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,你可能会看到与状态码相同的问题。