Flask应用程序从curl工作,而不是从请求

时间:2015-03-03 13:11:33

标签: python curl flask

以下是我正在处理的rest 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命令转换为python请求:

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]>

然而,正如您所见,它失败了。我不知道这是否是由于烧瓶库本身造成的,也不是由于不正确的请求命令与卷曲不同步。

我还试图将标题作为字典传入,并使用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 个答案:

答案 0 :(得分: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()方法正常工作了。如果您使用curl -X PUT,您可能已经看到了状态代码的相同问题。